【问题标题】:Alternative to: Static class as Generic-Parameter替代方案:作为通用参数的静态类
【发布时间】:2015-10-12 09:56:10
【问题描述】:

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

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

我已阅读,对于泛型,只能使用实例(因此不能使用静态类)。

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

【问题讨论】:

标签: c# reflection static-classes


【解决方案1】:

问题C# - static types cannot be used as type arguments 很好地解释了这种行为是有意的。

它没有告诉你应该做什么。在我看来,您可以使用单例模式来保留该类的一个实例。这样做的一个好处是您也可以使用继承,因此您不需要反射来完成现在所做的事情,您只需依赖基类的方法签名即可。

【讨论】:

    【解决方案2】:

    您可以只传递 Type 对象作为参数,而不是使用泛型。因为无论如何你都必须做typeof(T) .GetFields(,所以你并没有失去任何静态类型安全性。

    我强烈提出的另一个建议是使用将字符串映射到整数的字典来表示常量集合。像这样使用反射只会无缘无故地给你带来痛苦,对开发人员强制执行奇怪的,几乎是仪式化的规则(“这个静态类很神奇,不要添加任何字符串”),并且性能更差.

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2013-03-26
      相关资源
      最近更新 更多