介绍
我正在使用包含两个类的遗留代码:
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; }
}
Run Code Online (Sandbox Code Playgroud)
问题是
如何使用泛型扩展这些类,以在编译时解析Value属性的类型.它甚至可能吗?
示例案例可能如下:
DomainItem price = new DomainItem { Value = 25.20d, Identifier = Identifier.Price };
// ....
double priceValue = price.ProperValue; // generic property of type T
Run Code Online (Sandbox Code Playgroud)
显然,上面的代码是概念性的,它显示了我想要实现的目标.有什么建议如何解决?它甚至可能吗?
编辑
我的想法是创建一个新IEnumerable<DomainItem<T>>的集合,从非通用DomainItem对象填充集合.由于DomainItem.Value已知的类型,应该可以以某种方式进行这种收集.
没有泛型属性,但您可以轻松创建泛型方法:
public T GetValue<T>() { ... }
public void SetValue<T>(T value) { ... }
Run Code Online (Sandbox Code Playgroud)
然后,您可以typeof(T)在方法中检查以确保它适合您的标识符,理想情况下将标识符设置为只读.(作为构造函数参数会更好 - 我不希望有一个域名项随着时间的推移而变化的域项.)
或者,您可以只使用Value属性的类型dynamic而不是object,假设您在.NET 4+中使用C#4+.然后你的示例代码将编译 - 但它会double在执行时执行隐式(动态)转换.你不会那么安全,但它会编译......
| 归档时间: |
|
| 查看次数: |
9608 次 |
| 最近记录: |