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

How to dynamically get the instance of an object's property using reflection

我发现了很多例子,几乎可以告诉我我需要知道的东西。但到目前为止,一切都假设我已经有了一个要设置值的 属性 实例。但是我没有实例。我有一个 PropertyInfo 对象。我可以动态获取 属性 的名称但是为了调用 SetValue() 我 必须 有一个 实例 属性 传递给方法。如何获取需要设置其值的 属性 的实例?这是我的代码???其中必须提供 属性 的实例。如何获取 属性 的实例而不仅仅是 PropertyInfo 对象? (我写这个方法的原因是因为我不能保证各种存储过程会在哪些列return。)

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

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

property.SetValue(this, val, null);

很可能是您要查找的内容。

由于您正在获取 THIS.. 的属性,因此您实际上拥有了您要设置的对象的一个​​实例。只需在设置时使用 THIS 关键字即可。

当你像这样获取属性时

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

你像这样设置属性

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

如果您试图从您没有实例的对象中获取属性,这将不起作用。

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

希望这能回答您的问题!

干杯