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>();
}
答案 0 :(得分:2)
您无法将通用类型参数作为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);
}
答案 1 :(得分:0)
使Switch
成为通用方法,接受类型为object
的{{1}}
T
public void Switch<T>(T obj) where T : IMyClass
{
setObj<T>();
}
声明确保您只能致电where T : IMyClass
Switch
obj
instance
实施class
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
}
方法中使用参数T obj
。
答案 2 :(得分:-1)
尝试使用typeof(ClassA)
public void TypeTest(Type t)
{
if(t.Equals(typeof(ClassA))){
}
}