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