C# 动态字段取决于 "T"类型,没有硬编码

标签 c# .net generics

所以我有一个函数。它接收一个名为“item”的未知类型的对象。在函数中,它声明了一个对象,并根据Type是什么,取决于对象从'item'的哪个字段获取值,例如:

private static void CreateObject<T>(T item)
{
    SomeObject object = new SomeObject();

    //if 'item' is type "A"
    //          object.Text = item.Display
    //else if 'item' is type "B"
    //          object.Text = item.Text
    //else if 'item' is type "C"
    //          object.Text = item.Value


}

请注意,传递 'item.display' 的字符串或任何一个都不是一个选项,因为在此函数中进行了很多操作,这是用于解释所需内容的函数的简化版本。

如何以更优雅的方式做到这一点?

我看过反射,但被告知要避免这种情况,因为它很昂贵(硬件、内存等)

最佳答案

采用将提供Text

的委托(delegate)参数
private static void CreateObject<T>(T item, Func<T, object> prop)
{
    SomeObject obj = new SomeObject();

    obj.Text = prop(item).ToString();
}

所以方法的调用者会使用

CreateObject(a, t => t.Display);
CreateObject(b, t => t.Text);
// etc

关于C# 动态字段取决于 "T"类型,没有硬编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9781010/

相关文章:

java - 类型转换成原始类型

java - 泛型类的类 <T> 的名称

C# 正则表达式匹配列表中的单词

c# - 为什么这段代码不能编译? - 对象赋值、调用、递增、递减和新建可用作指令

c# - NHibernate 映射到另一个不在 ID 上的对象

c# - 我可以将自定义版本字符串添加到 .net DLL 吗?

c# - 为 MemoryCache(或任何缓存)实现通用 Get<T>

c# - 如何在 UWP 上将 SQLite 与 Entity Framework 6 一起使用?

c# - 当文件被不同的进程删除时,文件流会发生什么?

.net - 重新托管的工作流设计器中的 Intellisense