2

我正在从 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

4 回答 4

1

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

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

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

于 2012-09-12T02:03:39.473 回答
1

您正在寻找的(我认为)有时称为“宏替换”,在 C# 中不可用。您可以使用反射来执行类似的操作,以查找具有名称的属性localVariable,但除非您有数十个属性要设置和/或您希望避免在添加属性时更改开关,否则可能不值得这样做.

于 2012-09-12T02:04:30.047 回答
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)
于 2012-09-12T02:15:59.657 回答
1

使用FastMember库,它正是为此目的,比反射快WAAAAY 。

转到 Nuget/包管理控制台:

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;
        }

做完了。真是优雅。

于 2012-09-12T02:33:37.703 回答