Saeid
Saeid

Reputation: 13592

Get property name and type by pass it directly

I asked similar questions here And here

This is a sample Type:

    public class Product {

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

}

And I have a Generic class that needs properties to generate some HTML codes:

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
            }
        }

And I use this types as following:

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

GT.Generate();

So I think this process should be more easy as is but I don't know how implement it, I think to pass properties to the generator more simple, something like the followings Pseudo-code:

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

I don't know is this possible or not, I need just two things 1-PropertyName like: IsAllowed 2- property type like : bool. Maybe don't need to pass MainType I use it to get property types so if I can handle like the above don't need it any more.

What is your suggestion to implement something like this?

Is there any better way to do this?

Update

As ArsenMkrt said I found can use MemberExpression but I can't get Property Type, I see the property type in debugging see the picture:

enter image description here

So how can I get property type?

I found it here.

Upvotes: 1

Views: 706

Answers (1)

Arsen Mkrtchyan
Arsen Mkrtchyan

Reputation: 50752

You can use expression tree, than your code will look like this

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

You will need to create custom collection class derived from List for SelectedProperties and create add method like this

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

Hope this helps

Upvotes: 4

Related Questions