简介
我正在使用包含两个类的遗留代码:
- 我有一个存储其值
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)
以确保它适合您的标识符,最好将标识符设置为只读。 (作为构造函数参数会更好——我不希望拥有一个标识符随时间变化的域项有任何意义。)
或者,您可以只将 Value
属性的类型设置为 dynamic
而不是 object
,假设您在 .NET 4+ 中使用 C# 4+。然后您的示例代码将编译 - 但它会在执行时执行到 double
的隐式(动态)转换。你不会在那里得到太多安全,但它会编译...
关于c# - 非泛型类中泛型类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399384/