在C#中按名称访问类变量

时间:2012-09-12 01:53:10

标签: c# asp.net class variables

我正在读取xml文件中的数据并具有以下switch语句

switch (localVariable)
{
    case "myStringVariable":
        myClass.myStringVariable= subReader.ReadElementContentAsString();
        break;
    case "myOtherStringVariable":
        myClass.myOtherStringVariable= subReader.ReadElementContentAsString();
        break;
    case "myBoolVariable":
        myClass.myBoolVariable= subReader.ReadElementContentAsBool();
        break;

我想将此优化为类似

的内容
switch (localVariable)
{
    case "myStringVariable":
    case "myOtherStringVariable":
        myClass.localVariable= subReader.ReadElementContentAsString();
        break;
    case "myBoolVariable":
        myClass.localVariable= subReader.ReadElementContentAsBool();
        break;

4 个答案:

答案 0 :(得分:1)

我的猜测是你想要这样的东西:

        switch (localVariable)
        {
             case "myStringVariable":
             case "myOtherStringVariable":
                {
                    myClass.GetType()
                           .GetProperty(localVariable)
                           .SetValue(myClass, 
                                     subReader.ReadElementContentAsString(), 
                                     null);
                    break;
                }
             ...
        }

我应该同意其他人,他们在简单的场景中告诉我们避免反思。

答案 1 :(得分:1)

您正在寻找的(我推测)有时被称为“宏替换”,并且在C#中不可用。您可以使用反射来执行类似的操作来查找名称为localVariable的属性,但除非您已设置了数十个属性和/或您希望防止不得不更改每当你添加一个属性时,它都可能不值得做。

答案 2 :(得分:1)

您可以使用反射更进一步:

将以下方法添加到您的班级:

    private void SetVariableFromReader(string variableName)
    {
        var property = GetType().GetProperty(variableName);
        if (property != null)
        {
            if (typeof(string).IsAssignableFrom(property.PropertyType))
            {
                property.SetValue(this, subReader.ReadElementContentAsString());
            }
            if (typeof(bool).IsAssignableFrom(property.PropertyType))
            {
                property.SetValue(this, subReader.ReadElementContentAsBool());
            }
            // ...
        }
    }

然后,您只需调用:

,而不是在代码中使用switch语句
SetVariableFromReader(localVariable)

答案 3 :(得分:1)

使用FastMember库,正是为了这个目的, WAAAAY 比反射更快。

转到Nuget / Package Management控制台:

PM> Install-Package FastMember

然后:

public class Foo  {
    public string Bar { get; set; }
    public string Baz { get; set; }
}

class Program {
    public static void Main() {
        Foo f = new Foo();
        var wrapped = ObjectAccessor.Create(f);
        string propName = "Baz";
        wrapped[propName] = "Ah ha";
        Console.WriteLine(f.Baz);  //Prints Ah ha
    }
}

或者,在您的情况下:

var myWrappedClass = ObjectAccessor.Create(myClass);

        switch (localVariable) {
            case "myStringVariable":
            case "myOtherStringVariable":
                myWrappedClass[localVariable] = subReader.ReadElementContentAsString();
                break;
            case "myBoolVariable":
                myWrappedClass[localVariable] = subReader.ReadElementContentAsBool();
                break;
        }

完成并完成。真的很优雅。