C# 为运行时对子对象/生成方法的所有调用添加通用getter/setter

C# 为运行时对子对象/生成方法的所有调用添加通用getter/setter,c#,.net,reflection,C#,.net,Reflection,序言: 我正在实现一个系统,在这个系统中,开发人员可以在类型为T的对象上指定N个属性 我正在努力实现的目标: 我希望能够对如何设置和检索这些属性提供更具体的控制。这很困难,因为可能的配置数量是无限的 我追求的解决方案: 可以动态设置getter吗 或者通过属性?在施工过程中生成事后处理方法,如: 可能将类型T包装在一个容器对象中,该容器对象的属性之一是该类型。然后为此设置一些特殊类型的getter 我为什么要这样做: 目前,T的所有类型都是基于Typecode转换的。允许使用此库的用户轻

序言:

我正在实现一个系统,在这个系统中,开发人员可以在类型为T的对象上指定N个属性

我正在努力实现的目标:

我希望能够对如何设置和检索这些属性提供更具体的控制。这很困难,因为可能的配置数量是无限的

我追求的解决方案:

  • 可以动态设置getter吗
  • 或者通过属性?在施工过程中生成事后处理方法,如:
  • 可能将类型T包装在一个容器对象中,该容器对象的属性之一是该类型。然后为此设置一些特殊类型的getter
我为什么要这样做:

目前,T的所有类型都是基于Typecode转换的。允许使用此库的用户轻松地将来自不同来源(数据库、文本文件、应用程序配置等)的值解析为T类型的属性。重点是将这些属性作为类型安全值而不是神奇字符串交付

这是想要使用反射来实现这一点的动力,但我可以看到许多其他的应用程序

我可以说“嘿,让你所有的类型都可以为null。”这样就可以很容易地确定在类型T中设置了哪些属性


另一个选项是“确保您了解某些类型具有默认值。确保您已准备好接受这些值,或设置您自己的默认值(包括使其可为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.
    }