【发布时间】:2017-08-29 15:24:32
【问题描述】:
我对 C# 中的反射相当陌生,我想我知道如何使用它来解决一些问题。
但是,让我感到困惑的是 GetProperty() 或 GetField() 等方法的语法。
要获取实例字段,您必须执行typeof(MyClass).GetField("fieldName").GetValue(myClassInstance)。这不是最直接的事情。
使用扩展方法之类的方法获取实例字段或属性不是更有意义吗?比如:
myClassInstance.GetField("fieldName").Value
然后将前面的示例用于静态字段/属性/方法等内容。
感觉比第一个例子更自然,你必须传递你的类实例。
再说一次,我是 Reflection 的新手,所以我可能忽略了一些缺点。
【问题讨论】:
-
字段元数据是类的属性,而不是实例的属性。使用您的语法,您需要一个实例来获取有关该字段的信息。
-
另一个原因是扩展方法并不总是 c# 的一部分,所以当第一次编写反射代码时,它们显然不能使用扩展方法...
-
那么,您使用反射读取字段的频率如何?这通常不是一个非常常见的模式。是的,Object 上可能有一个扩展方法到
GetFieldValue(string name),你可以自己写一个。任何人都可以告诉您它在框架中不存在的唯一原因是设计者认为它不是一个有价值(足够)的功能。 -
就个人而言,我更喜欢将反射方法与标准对象模型分开。反射打破了关于访问修饰符等的常规规则。如果反射是每个对象公共 API 的标准部分,那么制作
private的意义何在? -
其实反射入口点在每个实例
obj.GetType().Get...上都有。
标签: c# .net reflection