You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#按名称获取类的myOwnType<T>类型属性值是否需用反射?

针对特定Test类实现类型安全的属性访问(无需反射)

结论先行:完全不需要用反射。既然你是针对特定的Test类做实现,直接硬编码分支处理是最高效、最类型安全的方案,完全能避免返回object类型。

实现方案

假设你的基础类型定义如下:

public class myOwnType<T>
{
    public T Value { get; set; }
}

public class Test
{
    public myOwnType<int> TestProp1 { get; set; }
    public myOwnType<decimal> TestProp2 { get; set; }
    public myOwnType<string> TestProp3 { get; set; }
}

你有两种靠谱的实现方式:

方式一:泛型方法(强类型、编译时检查)

给Test类添加一个泛型方法,通过属性名返回对应类型的属性值:

public myOwnType<T> GetProp<T>(string propName)
{
    return propName switch
    {
        nameof(TestProp1) => TestProp1 as myOwnType<T>,
        nameof(TestProp2) => TestProp2 as myOwnType<T>,
        nameof(TestProp3) => TestProp3 as myOwnType<T>,
        _ => throw new ArgumentException($"找不到属性:{propName}")
    };
}

调用时必须指定类型,编译阶段就能校验类型是否匹配:

var testInst = new Test { TestProp1 = new myOwnType<int> { Value = 456 } };
myOwnType<int> prop1 = testInst.GetProp<int>(nameof(TestProp1));

方式二:dynamic索引器(语法简洁,运行时类型确定)

如果偏好索引器的语法,可以写一个返回dynamic的索引器,运行时会自动解析对应类型:

public dynamic this[string propName]
{
    get
    {
        return propName switch
        {
            nameof(TestProp1) => TestProp1,
            nameof(TestProp2) => TestProp2,
            nameof(TestProp3) => TestProp3,
            _ => throw new ArgumentException($"找不到属性:{propName}")
        };
    }
}

调用示例:

var testInst = new Test { TestProp2 = new myOwnType<decimal> { Value = 12.34m } };
myOwnType<decimal> prop2 = testInst["TestProp2"];

为什么不选反射?

  • 性能劣势:反射每次调用都要执行属性查找、绑定操作,远不如编译时确定的硬编码分支高效。
  • 类型不安全:反射返回的是object类型,必须手动强制转换,极易出现InvalidCastException;而上面两种方式要么编译时校验类型,要么运行时自动匹配类型。
  • 无必要性:既然是针对特定Test类,属性都是已知固定的,硬编码的维护成本完全可控,换来的是极致的性能和类型安全。

内容的提问来源于stack exchange,提问作者totalZero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:42:36