代码之家  ›  专栏  ›  技术社区  ›  Matt

通过C中的字符串获取成员?

  •  3
  • Matt  · 技术社区  · 15 年前

    我的问题来自MVC SelectList (和上一代)。基本上,类接受IEnumerable并使用定义为字符串的成员。

    1. 它如何与对象(投射、反射)交互?
    2. (可能是多余的)它如何将成员作为字符串查找。

    这是我感兴趣的C的一个方面,但却找不到以下例子:(


    编辑 以下内容:

    我最终使用了System.Web.ui中的databinder.eval()。

    它仍然有反射的开销,但是通过允许您传递对象和包含 等级制度 你想要的成员。现在,这并不意味着什么,但这个项目是为接收LINQ数据而设计的,所以不必担心它,这会让我的生活变得更轻松。

    谢谢大家的帮助。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Jon Skeet    15 年前

    虽然我不确定它的实现,但我希望它使用反射。

    基本上你打电话来 Type.GetProperty Type.GetMethod 若要获取相关成员,请向它请求特定实例(或调用方法等)的该属性的值。或者有 Type.GetMembers , Type.GetMember 等。

    如果你想使用“person.mother.name”或类似的“path”,就我所知,你必须对自己进行解析。(可能有一些框架可以为您完成这项工作,但它们不在反射API中。)

    下面是一个简短但完整的示例:

    using System;
    using System.Reflection;
    
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
    class Test    
    {
        static void Main()
        {
            Person jon = new Person { Name = "Jon", Age = 33 };
            ShowProperty(jon, "Name");
            ShowProperty(jon, "Age");
        }
    
        static void ShowProperty(object target, string propertyName)
        {
            // We don't need no stinkin' error handling or validity
            // checking (but you do if you want production code)
            PropertyInfo property = target.GetType().GetProperty(propertyName);
            object value = property.GetValue(target, null);
            Console.WriteLine(value);
        }
    }
    
        2
  •  1
  •   µBio    15 年前

    是的,通过反射。看看 Type 类和关联方法。一个好的起点可能是 here .

    你总是可以看到MVC的 source 例如。