[英]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>();
}
您不能在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
語句確保您只能在obj
是實現IMyClass
的class
的instance
下調用Switch
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
。
嘗試使用typeof(ClassA)
public void TypeTest(Type t)
{
if(t.Equals(typeof(ClassA))){
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.