非泛型类中泛型类型的属性
本文关键字:属性 泛型类型 泛型类 | 更新日期: 2023-09-27 17:54:40
简介
我正在处理包含两个类的遗留代码:
- 我有一个类,它存储
System.Object
类型的值。(我将这个类命名为DomainItem
(- 其Identifier属性指枚举,它保存
DomainItem
类型的信息(在业务域的上下文(
- 其Identifier属性指枚举,它保存
- 还有一个类存储这些项作为可枚举列表。(
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
,假设您将C#4+与.NET 4+一起使用。然后,您的示例代码将进行编译,但它将在执行时执行到double
的隐式(动态(转换。在那里你不会得到太多安全,但它会编译。。。