如何使用反射动态获取对象属性的实例

时间:2018-05-08 16:25:00

标签: c# reflection .net-core propertyinfo

我找到了很多例子,几乎告诉我我需要知道什么。但到目前为止,所有内容都假定我已经拥有了我想要设置值的属性实例。但我没有实例。我有一个PropertyInfo对象。我可以动态获取属性的名称,但是为了调用SetValue(),我必须将属性的实例传递给方法。如何获取需要设置其值的属性实例?这是我的代码???必须提供属性的实例。如何获取属性的实例而不仅仅是PropertyInfo对象? (我编写此方法的原因是因为我无法保证各种存储过程将返回哪些列。)

protected new void MapDbResultToFields(DataRow row, DataColumnCollection columns)
{
    Console.WriteLine("Entered Clinician.MapDbResultToFields");
    var properties = this.GetType().GetProperties();
    Console.WriteLine("Properties Count: " + properties.Length);
    foreach (DataColumn col in columns)
    {
        Console.WriteLine("ColumnName: " + col.ColumnName);
    }
    foreach (var property in properties)
    {
        string propName = property.Name.ToLower();
        Console.WriteLine("Property name: " + propName);
        Console.WriteLine("Index of column name: " + columns.IndexOf(propName));
        Console.WriteLine("column name exists: " + columns.Contains(propName));
        if (columns.Contains(propName))
        {
            Console.WriteLine("PropertyType is: " + property.PropertyType);
            switch (property.PropertyType.ToString())
            {
                case "System.String":
                    String val = row[propName].ToString();
                    Console.WriteLine("RowColumn Value (String): " + val);
                    property.SetValue(???, val, null);
                    break;
                case "System.Nullable`1[System.Int64]":
                case "System.Int64":
                    Int64.TryParse(row[propName].ToString(), out var id);
                    Console.WriteLine("RowColumn Value (Int64): " + id);
                    property.SetValue(???, id, null);
                    break;
                case "System.Boolean":
                    Boolean.TryParse(row[propName].ToString(), out var flag);
                    Console.WriteLine("RowColumn Value (Boolean): " + flag);
                    property.SetValue(???, flag, null);
                    break;
            }

        }
        else
        {
            Console.WriteLine("Property name not found in columns list");
        }
    }
}

2 个答案:

答案 0 :(得分:3)

你错误地认为你需要一个你试图设置的属性的实例,但实际上你需要一个你想要设置属性的对象的实例。一个属性在它所属的对象之外没有生命。

property.SetValue(this, val, null);

很可能是你在找什么。

答案 1 :(得分:2)

因为你得到了这个的属性..你实际上有一个你想要设置的对象的实例。只需在设置时使用THIS关键字即可。

当你获得这样的属性时

var properties = this.GetType().GetProperties();

你设置这样的属性

foreach(var property in properties)
{
    property.SetValue(this, id, null);
}

如果您尝试从没有实例的对象获取属性,则此操作无效。

var properties = SomeObject.GetType().GetProperties();

希望这能回答你的问题!

干杯