非泛型类中泛型类型的属性

Dar*_*iak 5 c# generics

介绍

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

  • 我有一个类来存储它的System.Object类型值.(我把这个名字命名为DomainItem)
    • 它的Identifier属性是指枚举,它包含一种类型的信息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; }
}
Run Code Online (Sandbox Code Playgroud)

问题是

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

示例案例可能如下:

DomainItem price = new DomainItem { Value = 25.20d, Identifier = Identifier.Price };
// ....
double priceValue = price.ProperValue; // generic property of type T
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

Jon*_*eet 9

没有泛型属性,但您可以轻松创建泛型方法:

public T GetValue<T>() { ... }

public void SetValue<T>(T value) { ... }
Run Code Online (Sandbox Code Playgroud)

然后,您可以typeof(T)在方法中检查以确保它适合您的标识符,理想情况下将标识符设置为只读.(作为构造函数参数会更好 - 我不希望有一个域名项随着时间的推移而变化的域项.)

或者,您可以只使用Value属性的类型dynamic而不是object,假设您在.NET 4+中使用C#4+.然后你的示例代码将编译 - 但它会double在执行时执行隐式(动态)转换.你不会那么安全,但它会编译......