访问静态变量问题的模板方法

时间:2009-07-02 18:42:30

标签: c# .net

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

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

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

此方法目前无效。显然无法从类型参数访问静态变量。

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

3 个答案:

答案 0 :(得分: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#机制。

答案 1 :(得分: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);

答案 2 :(得分:0)

为什么不给bas类一个虚拟的GetTagName类,并让继承类重写那个?

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

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