如何使用反射动态获取对象的 属性 的实例
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();
希望这能回答您的问题!
干杯
我发现了很多例子,几乎可以告诉我我需要知道的东西。但到目前为止,一切都假设我已经有了一个要设置值的 属性 实例。但是我没有实例。我有一个 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();
希望这能回答您的问题!
干杯