c# - 非泛型类中泛型类型的属性

标签 c# generics

简介

我正在使用包含两个类的遗留代码:

  • 我有一个存储其值 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/

相关文章:

flutter - 为什么我的通用扩展方法需要动态而不是具体类型?

c# - 为什么使用伙伴类进行验证?

C# PdfSharp - 从 HTML 生成 PDF 的困难

c# - 如何将Linq用于多列

Swift:如何为泛型类定义通配符

java - 通用方法接受不同的数据类型列表

Java继承和泛型问题

c# - 根据文化将日期和时间正则表达式设置为 RegularExpressionValidator

c# - ASP.NET Core 2.1 Web.API 更改应用程序洞察工具用于日志记录的 key

c# - 如何覆盖泛型类中的依赖属性?