通过直接传递获取属性名称和类型

时间:2012-04-19 06:33:40

标签: c# c#-4.0 properties

我问了类似问题herehere

这是一个示例类型:

    public class Product {

    public string Name { get; set; }
    public string Title { get; set; }
    public string Category { get; set; }
    public bool IsAllowed { get; set; }

}

我有一个Generic类需要属性来生成一些HTML代码:

public class Generator<T> {

    public T MainType { get; set; }
    public List<string> SelectedProperties { get; set; }

    public string Generate() {

        Dictionary<string, PropertyInfo> props;
        props = typeof(T)
                .GetProperties()
                .ToDictionary<PropertyInfo, string>(prop => prop.Name);

        Type propType = null;
        string propName = "";
        foreach(string item in SelectedProperties) {
            if(props.Keys.Contains(item)) {
                propType = props[item].PropertyType;
                propName = item;

                // Generate Html by propName & propType
            }
        }

我使用以下类型:

Product pr = new Product();
Generator<Product> GT = new Generator<Product>();
GT.MainType = pr;
GT.SelectedProperties = new List<string> { "Title", "IsAllowed" };

GT.Generate();

所以我认为这个过程应该更容易,但我不知道如何实现它,我认为将属性传递给生成器更简单,如下所示:Pseudo-code:

GT.SelectedProperties.Add(pr.Title);
GT.SelectedProperties.Add(pr.IsAllowed);

我不知道这是否可能,我只需要两件事1-PropertyName like:IsAllowed 2-属性类型如:bool。也许不需要传递MainType我用它来获取属性类型,所以如果我能像上面那样处理它就不再需要它了。

你有什么建议来实施这样的事情?

有没有更好的方法呢?

更新

正如ArsenMkrt所说,我发现可以使用MemberExpression但我无法获取属性类型,我在调试中看到属性类型看到图片:

enter image description here

那我怎样才能获得房产类型?

我发现它here

1 个答案:

答案 0 :(得分:4)

您可以使用expression tree,而不是代码看起来像

GT.SelectedProperties.Add(p=>p.Title);
GT.SelectedProperties.Add(p=>p.IsAllowed);

您需要创建从List for SelectedProperties派生的自定义集合类,并创建像这样的添加方法

   //where T is the type of your class
   public string Add<TProp>(Expression<Func<T, TProp>> expression)
   {
        var body = expression.Body as MemberExpression;
        if (body == null) 
            throw new ArgumentException("'expression' should be a member expression");
        //Call List Add method with property name
        Add(body.Member.Name);
   }

希望这有帮助