7

介绍

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

  • 我有一个存储其类型值的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; }
}

问题是

如何使用泛型扩展这些类,以在编译时解析 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是已知的,因此应该可以以某种方式进行此类收集。

4

1 回答 1

13

没有泛型属性之类的东西,但您可以轻松创建泛型方法

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

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

然后,您可以typeof(T)在方法中检查以确保它适合您的标识符,最好将标识符设为只读。(作为构造函数参数会更好 - 我不希望拥有一个标识符随时间变化的域项目有任何意义。)

Alternatively, you could just make the type of the Value property dynamic instead of object, assuming you're using C# 4+ with .NET 4+. Then your example code would compile - but it would perform an implicit (dynamic) conversion to double at execution time. You wouldn't get much safety there, but it would compile...

于 2013-01-18T12:54:35.213 回答