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

时间:2009-11-16 21:45:37

标签: c# asp.net asp.net-mvc

我的问题源于MVC的SelectList(以及前几代)。基本上该类接受IEnumerable并使用您定义为字符串的成员。

  1. 它如何与对象交互(投射,反射?)
  2. (可能是多余的)如何将成员查找为字符串。
  3. 这是我感兴趣的C#的一个方面,但却找不到例子:(


    修改

    我最终使用System.Web.UI中的DataBinder.Eval()

    它仍然具有反射的开销,但允许您传递对象和包含所需成员的层次结构的字符串,从而使事情变得更容易。现在这并不是什么意思,但是这个项目的目的是为了获取Linq数据,所以不必担心它会让我的生活变得更轻松。

    感谢大家的帮助。

2 个答案:

答案 0 :(得分:4)

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

基本上,您调用Type.GetPropertyType.GetMethod来获取相关成员,然后向其询问特定实例的该属性的值(或调用方法等)。或者,有Type.GetMembersType.GetMember等。

如果你想能够使用“Person.Mother.Name”或类似的“路径”,你必须自己解析,据我所知。 (可能有一些框架可以为您完成,但它们不在反射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);
    }
}

答案 1 :(得分:1)

是的,通过反思。看一下Type类和相关方法。一个好的起点可能是here

您也可以随时查看MVC的source