2011-03-01 74 views
0

我的基类使用对派生类的反射来为它们提供一些功能。目前我这样做:如何在没有泛型的基类中获得派生类的类型?

abstract class BaseClass<T> 
{ 
    string GetClassString() 
    { 
     // Iterate through derived class, and play with it's properties 
     // So I need to know the type of derived class (here T). 
     return result; 
    } 

    static bool TryParse(string classString, out T result) 
    { 
     // I should declare a variable as T and return it 
    } 
} 

我可以做到这一点没有泛型?

+2

'T' *不是*派生类的类型 - 或者至少不必是。想象一下'class MyDerivedClass:BaseClass '。这里派生类是'MyDerivedClass',但'T'是'string'。 – 2011-03-01 12:47:30

+0

@Jon:那么如何声明'TryParse(string classString,out T derivedType) '? 'C#'是否允许我动态地在方法签名中定义'derivedType'并且不使用'T'? – Xaqron 2011-03-02 02:46:52

回答

4

编辑:

对不起,您要的类型参数(即typeof(T))。 在这种情况下,您仍然使用this.GetType(),但是您之后添加了.GetGenericArguments()[0]

尝试解析: 你需要创建一个类型的新实例,你不知道

有两种方式:一是 ,在不改变休息,与活化剂类和下面的代码:

result = (T) Activator.CreateInstance(typeof(T)) 

MSDN)。

之后,您可以添加一个“新”的约束你的类型:

MyClass<T> where T : new() {...} 
result = new T(); 

两个样本需要参数少构造。如果你想传递参数,那么你需要深入System.Reflection内部,获取构造函数列表并调用你想要的。工厂模式也可以完成这项工作。

+0

以及'TryParse'方法(我在编辑中添加了它)? – Xaqron 2011-03-01 12:56:25

+0

我在另一个编辑中添加了一些提示。 – 2011-03-01 13:50:13