如何获取对象的类型并将其作为参数传递给 C#
How to get the type of an object and pass it as a parameter in C#
ClassA
、ClassB
、ClassC
和 ClassD
都实现了 IMyClass
接口。
myObj
是 类.
之一的实例
private void setObj<T>()
{
myObj = mycollection.Single(w => w is T);
}
public void Switch()
{
if(myObj is ClassA)
{
setObj<ClassA>();
}
else if(myObj is ClassB)
{
setObj<ClassB>();
}
else if(myObj is ClassC)
{
setObj<ClassC>();
}
else if(myObj is ClassD)
{
setObj<ClassD>();
}
}
我们如何重构 Switch
方法,以便我有这样的东西:
public void Switch()
{
// How can we know from `myObj`, which class it is and rewrite
// the whole Switch method like this
// X = `ClassA`, `ClassB`, `ClassC` or `ClassD`
setObj<X>();
}
尝试使用 typeof(ClassA)
public void TypeTest(Type t)
{
if(t.Equals(typeof(ClassA))){
}
}
您不能在 C# 中将泛型类型参数作为变量传递。但是,您可以通过反射 (myObj.GetType()
) 获取类型并将其作为函数参数从 Switch()
函数传递给 setObj()
函数,这又可以在您的 lambda 中进行比较:
private void setObj(Type type)
{
myObj = Objects.Single(o => o.GetType() == type);
}
public void Switch()
{
Type setToThisType = myObj.GetType();
setObj(setToThisType);
}
也使 Switch
成为一个通用方法,它接受 T
类型的 object
public void Switch<T>(T obj) where T : IMyClass
{
setObj<T>();
}
where T : IMyClass
语句确保您只能调用 Switch
,其中 obj
是 class
的 instance
实现 IMyClass
void Example()
{
ClassA objA = new ClassA();
Switch(objA); //OK;
ClassX objX = new ClassX();
Switch(objX); //compile-time error since ClassX doesn't implement IMyClass
}
编辑:阅读标题后,我认为您需要在 Switch
方法中包含参数 T obj
。
ClassA
、ClassB
、ClassC
和 ClassD
都实现了 IMyClass
接口。
myObj
是 类.
private void setObj<T>()
{
myObj = mycollection.Single(w => w is T);
}
public void Switch()
{
if(myObj is ClassA)
{
setObj<ClassA>();
}
else if(myObj is ClassB)
{
setObj<ClassB>();
}
else if(myObj is ClassC)
{
setObj<ClassC>();
}
else if(myObj is ClassD)
{
setObj<ClassD>();
}
}
我们如何重构 Switch
方法,以便我有这样的东西:
public void Switch()
{
// How can we know from `myObj`, which class it is and rewrite
// the whole Switch method like this
// X = `ClassA`, `ClassB`, `ClassC` or `ClassD`
setObj<X>();
}
尝试使用 typeof(ClassA)
public void TypeTest(Type t)
{
if(t.Equals(typeof(ClassA))){
}
}
您不能在 C# 中将泛型类型参数作为变量传递。但是,您可以通过反射 (myObj.GetType()
) 获取类型并将其作为函数参数从 Switch()
函数传递给 setObj()
函数,这又可以在您的 lambda 中进行比较:
private void setObj(Type type)
{
myObj = Objects.Single(o => o.GetType() == type);
}
public void Switch()
{
Type setToThisType = myObj.GetType();
setObj(setToThisType);
}
也使 Switch
成为一个通用方法,它接受 T
object
public void Switch<T>(T obj) where T : IMyClass
{
setObj<T>();
}
where T : IMyClass
语句确保您只能调用 Switch
,其中 obj
是 class
的 instance
实现 IMyClass
void Example()
{
ClassA objA = new ClassA();
Switch(objA); //OK;
ClassX objX = new ClassX();
Switch(objX); //compile-time error since ClassX doesn't implement IMyClass
}
编辑:阅读标题后,我认为您需要在 Switch
方法中包含参数 T obj
。