1

我在这里这里问过类似的问题

这是一个示例类型:

    public class Product {

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

}

我有一个需要属性来生成一些 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();

所以我认为这个过程应该更简单,但我不知道如何实现它,我认为将属性传递给生成器更简单,类似于以下伪代码:

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

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

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

有没有更好的方法来做到这一点?

更新

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

在此处输入图像描述

那么如何获取属性类型呢?

我在这里找到了。

4

1 回答 1

4

您可以使用表达式树,而不是您的代码看起来像这样

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

您将需要为 SelectedProperties 创建从 List 派生的自定义集合类并创建像这样的 add 方法

   //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);
   }

希望这可以帮助

于 2012-04-19T06:39:38.363 回答