【问题标题】:Easy Reflection question C#简单反射问题 C#
【发布时间】:2009-06-05 03:15:55
【问题描述】:

我想提供未知的“对象”并返回其成员之一的值。在 C# 中需要响应。

一般来说,我想我正在寻找此方法的代码 public static object GetObjectMemberValue(object myObject, string memberName)

更具体地说,我正在为 Silverlight 中的资源字符串执行此操作,并且需要编写此方法。它位于一个通用项目中,用于针对几个不同的 Resx 字典,因此我无权访问类型信息。 public static string GetString(object StringResources, string ResourceId)

谢谢!

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    这将得到你的价值...你能在问题的 resx 部分给我更多信息吗?

    public static object GetObjectMemberValue(object myObject, string memberName)
    {
      PropertyInfo dateProperty = myObject.GetType().GetProperty(memberName);
      return dateProperty.GetValue(myObject, null);
    }
    

    【讨论】:

    • 这就是我所需要的。谢谢罗素。 resx 部分是一个不值得解释的hack。这只是我创建的一个糟糕的解决方法,因为 Silverlight 2.0 不允许我在多个 Silverlight 类库项目中包含资源字典 (xaml)。 Silverlight 3.0 支持合并字典,当我迁移时,我可以摆脱这个 hack。反射很酷,但我完全同意其他一些 cmets,因为当您可以强烈键入对象时应该避免它。
    【解决方案2】:

    如果你知道对象类型,然后转换成它?

    或者如果你不知道显式类型,它至少应该实现一个接口?

    MyType value = (MyType)objectGetter() //this is the function that returns the unknown.
    value.GetMember()
    

    【讨论】:

      【解决方案3】:
      static class ObjectExtensions {
          public static object GetObjectPropertyValue(this object o, string propertyName) {
              return o.GetType().GetProperty(propertyName).GetValue(o, null);
          }
      }
      
      class Test {
          public string Message {get; set;}
      }
      
      class Program {
          static void Main(string[] args) {
              object t = new Test { Message = "Hello, World!" };
              Console.WriteLine(t.GetObjectPropertyValue("Message").ToString());
          }
      }
      

      【讨论】:

      • 请不要在对象上写扩展方法。创建一个接口并在其上编写扩展方法。
      【解决方案4】:

      先获取对象的类型:

      键入 myObjectType = myObject.GetType();

      然后,您可以使用returned Type object 获取该属性的信息,然后它的值。

      【讨论】:

        【解决方案5】:
        o.GetType().InvokeMember( "MemberName", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, o, null );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          • 2016-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-13
          • 2011-08-29
          相关资源
          最近更新 更多