我想创建一个方法,它将一些基类型作为参数,并比较并检查它是否是派生类型,并根据它返回派生类型。 例如:
Class A : IBase
Class B : IBase
我的方法:
Public IBase GetData(IBase type)
{
If type is A then
{
//do smthing
return A
}
If type is B
{
//do smthing
return B
}
}
请帮助.....
答案 0 :(得分:4)
您应该在代码标记为//do something
的位置执行您要执行的步骤,并将其封装到类的方法中,我们称之为DoSomething()
。您将要向IBase
接口添加一个名为DoSomething()
的公共方法。然后,类型A
和类型B
都将实现此接口,并为此“Do Something”方法提供不同的实现。
然后,你的方法就是:
public IBase GetData(IBase type)
{
type.DoSomething();
return type; //not sure what this is for, maybe you're actually wanting to return type.GetType() ??
}
有关如何使用多态来消除对这些类型的if语句的需求的更多详细信息,请参阅文章Replace Conditional with Polymorphism。
答案 1 :(得分:3)
我从技术上讲,正确使用多态性应该完全不需要进行类型检查。
但是,声明类型参数必须实现接口的泛型函数是这样的:
public TBase GetData<TBase>(TBase type) where TBase : IBase
如果您确实想继续进行特定的类型检查,那么可以使用Type.IsAssignableFrom
功能。
public TBase GetData<TBase>(TBase type) where TBase : IBase
{
if (typeof(A).IsAssignable(typeof(TBase)))
{
// Do the special case stuff
}
...
}
但是当我开始提及时,或许将特殊情况的东西移到IBase界面本身更合适。
答案 2 :(得分:2)
此:
public T GetData<T>(T type) where T : IBase
{
....
}
答案 3 :(得分:0)
泛型在这里有点矫枉过正。让我们试试反思:
IBase type = GetSomeObjectOfDescendantType();
IBase newType = (IBase)Activator.CreateInstance(type.GetType());
您可以将其包装在方法
中public class MyDuplicator
{
public static object GetNotClone(object X)
{
return Activator.CreateInstance(X.GetType());
}
}
有关CreateInstance here的更多信息。
当然,只有当你的问题是关于返回类型A的对象时才适用,如果要放入类型A的对象。作为.Clone()
的东西,但是新构造的东西。