0

これは興味深い概念であり、実装方法がわかりませんでした。(デコレータパターンをデプロイする必要がある大学の課題に関連しています)。

以下に大まかな C# コードを書きましたが、これはコンパイルされませんが、クラスがあるとします。

Class A {
   public int A { get; set; }
   public string B { get; set; }
   public float C { get; set; }

   public string concatFields() {
       string sample = null;
       foreach (Field f in this) {
           sample += f.ToString();
       }
       return sample;
   }
}

concatFields メソッドをどのように実現しますか? クラスのフィールドを (フィールドの名前を知らずに) 反復処理し、それぞれに ToString() を呼び出す方法はありますか。

例 B のシナリオでは、フィールドが同じタイプである場合、すべてのフィールドに同じメソッドをどのように適用しますか。

助けてくれてありがとう、私はこれをC#でタグ付けしましたが、他のどのタグを適用できるかわかりません

4

4 に答える 4

1

リフレクションを使用したり、クラスのメタデータを反復処理したり、リフレクションAPIを介してフィールドをプルしたりできます。明らかに、それに付随するコストがあります。リフレクションの使用は、フィールドに直接アクセスするよりも遅くなります。時々、かなり。しかし、あなたは確かにそれを行うことができます。次に例を示します。

MyClass obj = new MyClass();
// Set fields in the obj...
var fields = typeof(MyClass).GetFields(System.Reflection.BindingFlags.GetField);
StringBuilder res = new StringBuilder();
foreach (FieldInfo f in fields) {
    var val = f.GetValue(obj);
    if (val != null) res.Append(val.ToString());
}
Console.WriteLine(res.ToString());

FieldInfoNameclassは、やなどの多くの便利なプロパティを公開Typeし、処理に含めるフィールドと無視するフィールドを選択できるようにします。

于 2012-04-22T03:17:55.187 に答える
0

'フィールド'を辞書に入れます。

そして、辞書を反復処理する方法は次のとおりです。C#で辞書を反復処理するための最良の方法は何ですか?

于 2012-04-22T03:11:58.433 に答える
0

.NET/C# の場合、型のイントロスペクションはSystem.Reflection名前空間を介して処理されます。これにより、型に関する情報を取得し、コンパイル時に不明なメソッドを動的に呼び出すことができます。

concatFields メソッドをどのように実現しますか? クラスのフィールドを (フィールドの名前を知らずに) 反復処理し、それぞれで ToString() を呼び出す方法はありますか。

public string concatFields() {
   string sample = null; // a StringBuilder would be a better choice here
   foreach (FieldInfo f in this.GetType().GetFields()) {
       obj fieldValue = f.GetValue();
       if (fieldValue != null) sample += fieldValue.ToString();
   }
   return sample;
}

例 B のシナリオでは、フィールドが同じタイプである場合、すべてのフィールドに同じメソッドをどのように適用しますか。

コンパイル時に型がわかっている場合は、それにキャストできます。

foreach (FieldInfo f in this.GetType().GetFields()) {
    MyType myType = (MyType)f.GetValue();
    myType.MyMethod();
}

または、リフレクションを介して動的に呼び出すことができます。

foreach (FieldInfo f in this.GetType().GetFields()) {
    object fieldValue = f.GetValue();
    MethodInfo mi = fieldValue.GetType().GetMethod("MyMethod");
    mi.Invoke(fieldValue, null); // no parameters to MyMethod
}
于 2012-04-22T03:24:33.810 に答える
0

これは私がこれを行う方法です:

class A

{
    public int A { get; set; }
    public string B { get; set; }
    public float C { get; set; }

    public string[] concatFields()
    {
        var v = from f in this.GetType().GetFields() select f;
        IList<string> fields = new List<string>();
        foreach (var f in v)
        {
            fields.Add(f.GetValue(this).ToString());
        }
        return fields.ToArray<string>();
    }
}
于 2012-04-22T03:30:41.983 に答える