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

リフレクションを使用して、さらに一歩進めることができます。

次のメソッドをクラスに追加します。

    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 /PackageManagementコンソールに移動します。

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 に答える
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 に答える