替代方案:Static class as Generic-Parameter

时间:2015-10-12 09:56:11

标签: c# reflection static-classes

我确实有很多静态类代表不同模块中的不同状态。但是,它们共享提取其信息的常用算法。

public static class Constants
{
    public static readonly int A = 0;
}

所以现在我为每个类都有多个静态函数来执行此操作。它们仅在处理的静态类的类型(及其总名称)上有所不同。

public static SelectListItem getConstantsSelectListItem()
{ // pseudo example
     return new SelectListItem { Text = "A" , Value = Constants.A };
}

要删除当前并避免将来的代码片段,我想在静态类上使用反射。这是我的方法,可以完成这项工作(如果可能的话):

public static ReturnType getProperties< T >()
{ // basically same logic as getConstantsSelectListItem
    var propertyList = typeof( T ) .GetFields( BindingFlags.Public | BindingFlags.Static ).ToList();

    foreach( var item in propertyList )
    {
        var curConstant = (int)( item.GetValue( null ) );

        // do some work here..
    }
}

var constantsProperties = getProperties<Constants>();

错误是:

static types cannot be used as argument types

我已经读过,对于泛型,只能使用实例(因此没有静态类)。

做出类似工作的好方法是什么?

2 个答案:

答案 0 :(得分:1)

问题C# - static types cannot be used as type arguments非常清楚地表明了这种行为。

它没有告诉你应该做什么。在我看来,你可以使用单例模式来保留该类的一个实例。这样做的一个好处是你也可以使用继承,所以你不需要反思去做你现在做的伎俩,你可以只依靠基类&#39;方法签名。

答案 1 :(得分:1)

您可以将Type对象作为参数传递,而不是使用泛型。既然你必须做typeof(T) .GetFields(,那就不像你有任何静态类型的安全性而已经失去了。

我强烈建议的另一个建议是使用字典将字符串映射到整数来表示常量集合。使用这样的反射只是给你带来痛苦,没有充分的理由,对开发人员强制执行奇怪的,几乎是仪式性的规则(“这个静态类是神奇的,添加任何字符串”),并且性能更差