2

これは、私が最近かなり直面している問題です。私はそれを機能させるための一種のハックを知っていますが、それが最善の方法であるかどうかはわかりませんが、それがリフレクションに欠ける唯一の方法であるように思われます。

私がやろうとしていること: ユーザー入力 (文字列) を通じて変更できるようにしたいクラス インスタンスがあります。たとえば、次のようになります。

public class Apple
{

   private String color; //Color of the apple
   private float cost; //Cost of the apple
   private double radius; //Radius of the apple

   public Apple()
   {
      this.color = "";
      this.cost = 0;
      this.radius = 0;
   }

   //The method I am concerned/talking about
   public void setValue(String key, Object value)
   {
      if (key.equalsIgnoreCase("color"))
      {
         this.color = (String)value;
      }
      else if (key.equalsIgnoreCase("cost"))
      {
         this.cost= (float)value;
      }
      else if (key.equalsIgnoreCase("radius"))
      {
         this.radius = (double)value;
      }
   }
}

これは悪いフォームと見なされますか? 変更したいプロパティ/フィールドを識別するためのキー (文字列) をユーザーから取得し、変更したい値を示す別の文字列 (値) を取得します。確かにリフレクションは使えますが、

A) 形が悪いと聞いて眉をひそめた

B)変数名に関して完全な正確さが必要です。したがって、「appleColor」があり、ユーザーが「applecolor」を入力すると、機能しません。または、「applecolor」があり、ユーザーが「color」などを入力できるようにしたい場合。

これを行うための、より構造化された/オブジェクト指向の/便利な方法があるかどうか疑問に思っています。おそらく、「setValue()」を必要とする各クラスに、プロパティ/フィールドをその文字列キーに一致させる HashMap を持たせることを考えましたが、「getHashMap()」などのメソッドを使用してそれを実現する必要があるかどうかはわかりませんハッシュマップを返す

hashMap.put("color", color)... または何。

この問題を処理する設計パターンの方向性を私に示しているだけであっても、助けていただければ幸いです。

4

1 に答える 1

0

プログラムに、マップするプロパティを本能的に認識させたいですか?それは実行可能ではありません。リフレクションライブラリを使用したくない場合は、独自に実行して、希望どおりにキーを操作してください。

大文字と小文字を区別せず、containsを使用してキーを比較してください。

これがあなたを助けることができるアルゴリズムです、あなたの好みでそれを変えてください:

public static T Cast<T>(this Object myobj)
    {
        Type objectType = myobj.GetType();
        Type target = typeof(T);
        var x = Activator.CreateInstance(target, false);
        var z = from source in objectType.GetMembers().ToList() where source.MemberType == MemberTypes.Property select source;
        var d = from source in target.GetMembers().ToList() where source.MemberType == MemberTypes.Property select source;
        List<MemberInfo> members = d.Where(memberInfo => d.Select(c => c.Name).ToList().Contains(memberInfo.Name)).ToList();
        PropertyInfo propertyInfo;
        object value;
        foreach (var memberInfo in members)
        {
            propertyInfo = typeof(T).GetProperty(memberInfo.Name);
            PropertyInfo _prop = myobj.GetType().GetProperty(memberInfo.Name);
            if (_prop != null)
            {
                value = _prop.GetValue(myobj, null);
                try
                {
                    propertyInfo.SetValue(x, value, null);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
            }
        }
        return (T)x;
    }
于 2013-02-28T16:36:55.170 に答える