Reflection and generic types

后端 未结 3 1483
借酒劲吻你
借酒劲吻你 2020-12-05 05:48

I\'m writing some code for a class constructor which loops through all the properties of the class and calls a generic static method which populates my class with data from

3条回答
  •  不思量自难忘°
    2020-12-05 06:11

    Do you want to call DoStuff with T = the type of each property? In which case, "as is" you would need to use reflection and MakeGenericMethod - i.e.

    var properties = this.GetType().GetProperties();
    foreach (PropertyInfo p in properties)
    {
        object value = typeof(MyClass)
        .GetMethod("DoStuff")
        .MakeGenericMethod(p.PropertyType)
        .Invoke(null, new object[] { p.Name });
        p.SetValue(this, value, null);
    }
    

    However, this isn't very pretty. In reality I wonder if it wouldn't be better just to have:

    static object DoStuff(string name, Type propertyType);
    ... and then
    object value = DoStuff(p.Name, p.PropertyType);
    

    What does the generics give you in this example? Note that value-types will still get boxed etc during the reflection call - and even then boxing isn't as bad as you might think.

    Finally, in many scenarios, TypeDescriptor.GetProperties() is more appropriate than Type.GetProperties() - allows for flexible object models etc.

提交回复
热议问题