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

本文关键字:属性 泛型类型 泛型类 | 更新日期: 2023-09-27 17:54:40

简介

我正在处理包含两个类的遗留代码:

  • 我有一个类,它存储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的类型是已知的,所以应该可以以某种方式进行这样的收集。

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

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

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

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

或者,可以只将Value属性的类型设为dynamic,而不是object,假设您将C#4+与.NET 4+一起使用。然后,您的示例代码将进行编译,但它将在执行时执行到double的隐式(动态(转换。在那里你不会得到太多安全,但它会编译。。。