简介

我正在使用包含两个类的旧代码:

  • 我有一个存储其System.Object类型值的类。
    (我将此类命名为DomainItem)
  • 其“标识符”属性引用
    包含信息的枚举类型是DomainItem(在
    业务领域的上下文)。
  • 还有一个存储这些内容的类
    项目作为可枚举列表。 (DomainItems)

  • 更重要的是:
  • 我不想将这些类更改为泛型。此代码非常敏感,没有被测试覆盖。
  • 为了获取DomainItem,我必须从DomainItems.Items集合中获取它。

  • 代码

    类的代码等效如下:
    public class DomainItem
    {
        public Identifier Identifier { get; set; } // Readonly in the "real" code
        public object Value { get; set; }
    }
    
    public class DomainItems
    {
        public IEnumerable<DomainItem> Items { get; set; }
    }
    

    问题是

    我如何使用泛型扩展这些类,以在编译时解析Value属性的类型。可能吗?

    示例案例可能如下所示:
    DomainItem price = new DomainItem { Value = 25.20d, Identifier = Identifier.Price };
    // ....
    double priceValue = price.ProperValue; // generic property of type T
    

    显然,以上代码是概念性的,它显示了我想要实现的目标。有什么建议如何解决吗?可能吗?

    编辑

    我的想法是创建一个新的IEnumerable<DomainItem<T>>,从非通用DomainItem对象填充该集合。由于DomainItem.Value的类型是已知的,因此应该可以以某种方式进行此类收集。

    最佳答案

    没有通用属性,但是您可以轻松地创建通用方法:

    public T GetValue<T>() { ... }
    
    public void SetValue<T>(T value) { ... }
    

    然后,您可以在方法中检查typeof(T),以确保它适合您的标识符,理想情况下,使标识符为只读。 (作为构造函数参数会更好-我不希望它的标识符随时间而变化对域项目没有任何意义。)

    另外,假设您使用的是C#4+和.NET 4+,则可以只将Value属性的类型设为dynamic而不是object。然后,您的示例代码将进行编译-但是它将在执行时执行对double的隐式(动态)转换。您在那里不会有太多的安全性,但可以编译...

    关于c# - 非泛型类中泛型类型的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14399384/

    10-10 12:39