我找到了很多例子,几乎告诉我我需要知道什么。但到目前为止,所有内容都假定我已经拥有了我想要设置值的属性实例。但我没有实例。我有一个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");
}
}
}
答案 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();
希望这能回答你的问题!
干杯