none
如何动态得到特定的field名称 RRS feed

  • 问题

  • 我有一段代码需要反射得到MyClass.Field1 的FieldInfo。 于是我使用了 FieldInfo1 = typeof(MyClass).GetField("Field1"); 且运行正常。

    但是随后我发现这段代码是有维护风险的。因为如果我今后修改了 Field1这个字段的名称,那么我必须要记得修改后面代码中字符串("Field1")中的内容。这在大多数情况下都是不可能做到的。因为不能保证今后开发的人还是我。而且就算今后还是我维护这段代码,我也不可能总记着这种事情。

    因此我想知道是否有办法在运行时动态得到"Field1"。这样的话,无论谁或何时修改了 MyClass.Field1 的名字,所有与之相关的内容都会被更新,至少错误会在编译过程中被发现。 谢谢

     


    信奎爷,无所畏惧!!
    2011年4月5日 4:03

答案

  • 用反射的时候,这个是没有办法的。

    2011年4月5日 8:48
  • 可以找一个比较 Tricky 的方法。例如,为需要动态获取 Fieldinfo 的字段创建一个 Attribute,如:

    public class DynamicFieldInfoAttribute : Attribute

    然后再代码中标记:

    public class MyClass
    {
        [DynamicFieldInfo]
        public int MyField;
    }

    然后需要在得到 FieldInfo 的地方,利用 Attribute.GetCustomAttribute() 得到哪个 Field 上附加了这个 Attribute,那么也就得到了这个 Field 的 FieldInfo 了。


    Mark Zhou
    2011年4月5日 8:59
  • 可以找一个比较 Tricky 的方法。例如,为需要动态获取 Fieldinfo 的字段创建一个 Attribute,如:

     Attribute.GetCustomAttribute() 得到哪个 Field 上附加了这个 Attribute,那么也就得到了这个 Field 的 FieldInfo 了。


    Mark Zhou


    Dear Zhou。非常感谢你的建议,它的确可以间接的实现我想要的功能。 不过他会额外增加另外的代码开发成本,而且也让代码更加难懂了。看来C# 确实是无法办到了。希望.Net5.0 能增加一个运算符getfield( Obj.Field1) 就像 typeof( Myclass)一样。。嘿嘿。

    最后的结论就是我认了。就保留现在的做法不变,并且在开发说明文件中增加相应的特别提示。但愿今后的开发人员能够注意到这点:P


    信奎爷,无所畏惧!!
    2011年4月5日 9:48

全部回复

  • 用反射的时候,这个是没有办法的。

    2011年4月5日 8:48
  • 可以找一个比较 Tricky 的方法。例如,为需要动态获取 Fieldinfo 的字段创建一个 Attribute,如:

    public class DynamicFieldInfoAttribute : Attribute

    然后再代码中标记:

    public class MyClass
    {
        [DynamicFieldInfo]
        public int MyField;
    }

    然后需要在得到 FieldInfo 的地方,利用 Attribute.GetCustomAttribute() 得到哪个 Field 上附加了这个 Attribute,那么也就得到了这个 Field 的 FieldInfo 了。


    Mark Zhou
    2011年4月5日 8:59
  • 可以找一个比较 Tricky 的方法。例如,为需要动态获取 Fieldinfo 的字段创建一个 Attribute,如:

     Attribute.GetCustomAttribute() 得到哪个 Field 上附加了这个 Attribute,那么也就得到了这个 Field 的 FieldInfo 了。


    Mark Zhou


    Dear Zhou。非常感谢你的建议,它的确可以间接的实现我想要的功能。 不过他会额外增加另外的代码开发成本,而且也让代码更加难懂了。看来C# 确实是无法办到了。希望.Net5.0 能增加一个运算符getfield( Obj.Field1) 就像 typeof( Myclass)一样。。嘿嘿。

    最后的结论就是我认了。就保留现在的做法不变,并且在开发说明文件中增加相应的特别提示。但愿今后的开发人员能够注意到这点:P


    信奎爷,无所畏惧!!
    2011年4月5日 9:48