C# 为运行时对子对象/生成方法的所有调用添加通用getter/setter
序言: 我正在实现一个系统,在这个系统中,开发人员可以在类型为T的对象上指定N个属性 我正在努力实现的目标: 我希望能够对如何设置和检索这些属性提供更具体的控制。这很困难,因为可能的配置数量是无限的 我追求的解决方案:C# 为运行时对子对象/生成方法的所有调用添加通用getter/setter,c#,.net,reflection,C#,.net,Reflection,序言: 我正在实现一个系统,在这个系统中,开发人员可以在类型为T的对象上指定N个属性 我正在努力实现的目标: 我希望能够对如何设置和检索这些属性提供更具体的控制。这很困难,因为可能的配置数量是无限的 我追求的解决方案: 可以动态设置getter吗 或者通过属性?在施工过程中生成事后处理方法,如: 可能将类型T包装在一个容器对象中,该容器对象的属性之一是该类型。然后为此设置一些特殊类型的getter 我为什么要这样做: 目前,T的所有类型都是基于Typecode转换的。允许使用此库的用户轻
- 可以动态设置getter吗李>
- 或者通过属性?在施工过程中生成事后处理方法,如:
- 可能将类型T包装在一个容器对象中,该容器对象的属性之一是该类型。然后为此设置一些特殊类型的getter
另一个选项是“确保您了解某些类型具有默认值。确保您已准备好接受这些值,或设置您自己的默认值(包括使其可为null,并在需要时将其设置为null)”我不相信你能在静态类型的属性上设置访问器方法。我认为你必须要解决的另一个挑战是你的目标是提供类型安全性——你看,如果你的类型是在运行时构建的,编译时检查将不起作用,这是您将不得不大量依赖
dynamic
——这很慢。但并非所有功能都会丢失。您至少有两种选择:
捷径
您可以生成从具体类型继承的代理类。Theese将使您能够截获对基成员的方法调用,并执行几乎任何您喜欢的操作。请参阅
艰难但正确的方法(实际上第一个选择是在幕后使用)
您正在看。这是linq表达式树之上的一个步骤,从某种意义上说,您可以通过编程方式生成自己的程序集和类型。然而,这非常复杂且容易出错。我建议您首先尝试选项一,并且仅在绝对必要时生成自己的IL
UPD我知道你不想要魔法字符串,我想这是一个不太传统的解决方案,但也要检查CodeDOM名称空间感谢如此快速的响应!我肯定会在未来几天在这里研究动态代理。而且,据我所知,最接近PostSharp之外的C#AOP。
foreach(var property in typeOf(T).GetProperties())
{
//dynamically generate getter method which returns this property.
}