我有一个View Mode类。
public class VM_MyClass
{
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Date Of Birth")]
public string DOB { get; set; }
}
我想使用这样的属性:
VM_MyClass model = new VM_MyClass();
model[0] = "Alpha" // Name
model[1] = "11/11/14" // DOB
有可能吗?
答案 0 :(得分:2)
您可以使用索引器和反射API,如下例所示 (正如其他人所说,你必须非常小心)
public class VM_MyClass
{
private static Type ThisType = typeof(VM_MyClass);
public string Name { get; set; }
public DateTime DOB { get; set; }
public object this[string propertyName]
{
get
{
return GetValueUsingReflection(propertyName);
}
set
{
SetValueUsingReflection(propertyName, value);
}
}
private void SetValueUsingReflection(string propertyName, object value)
{
PropertyInfo pinfo = ThisType.GetProperty(propertyName);
pinfo.SetValue(this, value, null);
}
private object GetValueUsingReflection(string propertyName)
{
PropertyInfo pinfo = ThisType.GetProperty(propertyName);
return pinfo.GetValue(this,null);
}
}
你可以像这样使用它:
using System;
using System.Reflection;
namespace Example
{
class Program
{
static void Main(string[] args)
{
VM_MyClass model = new VM_MyClass();
model["Name"] = "My name";
model["DOB"] = DateTime.Today;
Console.WriteLine(model.Name);
Console.WriteLine(model.DOB);
//OR
Console.WriteLine(model["Name"]);
Console.WriteLine(model["DOB"]);
Console.ReadLine();
}
}
}
答案 1 :(得分:0)
@Georg Vovos,谢谢你的回答,我也用这种方法解决了这个问题。根据我上面的评论,我需要将数组的值赋给模型属性。所以我发现了这种方式。
我正在使用您的方法,这更合适:)感谢您的帮助。
VM_MyClass model = new VM_MyClass();
var ClassProperties = model.GetType().GetProperties();
int counter = 0;
foreach (var item in col)
{
Type type = model.GetType();
System.Reflection.PropertyInfo propertyInfo = type.GetProperty(ClassProperties[counter].Name);
propertyInfo.SetValue(model, item.InnerText);
counter++;
}