C#将类属性用作数组

时间:2014-09-15 15:49:18

标签: c# asp.net-mvc-4

我有一个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

有可能吗?

2 个答案:

答案 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++;
    }