如何查找类实例的通用属性名称以及如何为属性运行时赋值

时间:2011-11-17 16:53:53

标签: c# .net class generics reflection

我有以下课程。在BE的例子中(假设是objBE)我想在运行时选择属性名并指定它的值。例如我们有一个组合所有填充的属性,并在窗口窗体上有文本框和命令按钮。我想从组合中选择属性名称并在文本框中键入一些值,然后在按钮上单击我想从objBE中找到属性名称并将文本框值分配给所选属性。无法通过如何完成它。可以一些帮助。 提前致谢。 H N

public class MyPropertyBase
{
    public int StartOffset { get; set; }
    public int EndOffset { get; set; }
}

public class MyProperty<T> : MyPropertyBase
{
    public MyProperty(T propertyValue)
    {
        PropertyValue = propertyValue;
    }

    public T PropertyValue { get; set; }

    public static implicit operator MyProperty<T>(T t)
    {
        return new MyProperty<T>(t);
    }
}

public class BE
{
    private List<Admin_Fee> _Admin_Fee = new List<Admin_Fee>();

    public MyProperty<int> RFID
    {get;set;}
    public MyProperty<string> CUSIP
    {get;set;}
    public MyProperty<string> FUND_CITY 
    {get;set;}

    public MyProperty<int> SomeOtherProperty { get; set; }
    //public List<MyPropertyBase> MyDataPoints { get; set; }
    public List<Admin_Fee> Admin_Fee 
     {
         get{return _Admin_Fee;}
         set{}
     }
}

1 个答案:

答案 0 :(得分:0)

您可以在GetProperty上使用Type,然后在SetValue实例上使用PropertyInfo。根据你的描述,我想你想要这样的东西:

void Main()
{
    BE be  = new BE();
    SetMyPropertyValue("RFID", be, 2);
    SetMyPropertyValue("CUSIP", be, "hello, world");

    Console.WriteLine(be.RFID.PropertyValue);
    Console.WriteLine(be.CUSIP.PropertyValue);
}

private void SetMyPropertyValue(string propertyName, object instance, object valueToSet) 
{
    Type be = instance.GetType();
    Type valueType = valueToSet.GetType();
    Type typeToSet = typeof(MyProperty<>).MakeGenericType(valueType);
    object value = Activator.CreateInstance(typeToSet,valueToSet);

    var prop = be.GetProperty(propertyName);
    prop.SetValue(instance, value, null);
}