2009-07-02 62 views
0

假设我有两个包含静态变量XmlTag的类。第二类继承自第一类。我有一个模板方法,需要根据它使用的类型来获取XmlTag。什么是最好的方式来实现这一点,而不必创建一个类型的实例?这里有一个例子(不会编译),应该有希望说明我在说什么。访问静态变量的模板方法问题

class A{ 
public static readonly string XmlTag = "AClass"; 
} 

class B : A { 
public static readonly string XmlTag = "BClass"; 
} 

此方法当前无效..静态变量显然无法从Type参数中访问。

string GetName<T>(T AClass) where T : A 
{ 
    return T.XmlTag; 
} 

回答

5

首先,停止将泛型方法视为模板。他们不是模板。它们与模板有着非常不同的行为;你期望他们像模板一样行事,这可能是你在这种情况下导致你误入歧途的原因。

这是我写的关于您的场景以及为什么它是非法的一系列文章。

http://blogs.msdn.com/ericlippert/archive/2007/06/14/calling-static-methods-on-type-variables-is-illegal-part-one.aspx

http://blogs.msdn.com/ericlippert/archive/2007/06/18/calling-static-methods-on-type-variables-is-illegal-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2007/06/21/calling-static-methods-on-type-variables-is-illegal-part-three.aspx

注意,当然是 “动态” 的功能,我在第三部分暗示,其实是航运与C#4.0。

要解决您的实际问题:“这是做什么的最好方法?”据推测,你有一些问题,你相信这样的机制会解决。这个机制在C#中并不存在。 我们不可能推断出实际上你试图解决什么问题,因为你希望这个机制存在。而不是问“如何让这个不可能的事情在C#中工作?”而不是描述了你有真正的问题,我们可以尝试提出一个现有的C#机制,更好地解决您的真正问题。

+0

谢谢你的回复。你的文章是一个有趣的阅读。我的问题很简单,但我很难想出一个好的解决方案:我有几个子类,每个子类都有自己独特的XML标签常量。我有一个泛型方法Load(),它接受任何这些子类,并从XmlNode中加载该类的实例。 Load()需要根据正在使用的类型获取xml标签,以便知道要查找哪些xml标签。 – Mav3rick 2009-07-02 20:25:36

+0

只有在找到xml标签后才会实例化子类。 – Mav3rick 2009-07-02 20:33:03

1

有没有直接的方法可以做到这一点,而不诉诸反思。

如果你真的想这样做(我建议你首先要考虑改变你的高层设计):

为了得到一个字段值:

var returnValue = typeof(T).GetField("FieldName").GetValue(null); 

要获得一个属性:

var returnValue = typeof(T).GetProperty("PropertyName").GetValue(null, null); 

要调用的方法:

typeof(T).InvokeMember("MethodName", BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, null, null); 
0

为什么不给bas类创建一个虚拟的GetTagName类,并让继承类覆盖那个?

class A{ 
public virtual string GetXmlTagName() 
    { 
    return "AClass"; 
    } 
} 

它会解决您的即时症状,但林不知道解决您的问题。它有一个绝对的代码气味,但不知道更多我可能是错误的,当我声明XML的概念应该存在于不同的类中,并且在A和B中具有该概念违反单一责任原则。基本上我会从信息中知道我只是怕它