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
相关产品推荐
相关产品推荐

