3

選択したフィールドで特定のクラスのオブジェクトをフィルター処理する機能があります。私が現在行っている方法は、フィールドに名前を付ける文字列を引数として関数に渡すことです。理想的には、辞書と同様に、この文字列を使用してオブジェクト内のフィールドを選択できるようにしたいと考えています (この機能は、たとえば JavaScript に存在します)。

したがって、ここに関数があります(関連するビットに切り詰められます):

private List<HangingArtBundle> ConstrainBundlesBy(List<HangingArtBundle> bundles, string valueString, string constraint)
{
    List<HangingArtBundle> retBundles = new List<HangingArtBundle>();
    List<string> values = new List<string>(valueString.Split(new char[] { '|' }));

    foreach (HangingArtBundle bundle in bundles)
    {
        if (values.Contains(ConstrainedField(constraint, bundle)))
        {
            retBundles.Add(bundle);
        }
    }

    return retBundles;
}

ConstrainedField(constraint, bundle)その部分を のようなものに置き換えられるようにしたいと思いますbundle[constraint]。 whereconstraintはクラスのフィールドの名前ですHangingArtBundle。代わりに、以下の関数を使用する必要があります。これには、必要に応じてフィールド名を手動で追加する必要があります。

private string ConstrainedField(string field, HangingArtBundle bundle)
{
    if (field.Equals("Category"))
    {
        return bundle.Category;
    }
    else if (field.Equals("AUToolTab"))
    {
        return bundle.AUToolTab;
    }
    else
    {
        return "";
    }
}

それがまったく役立つ場合、これがクラスです(本質的には単なる構造体です):

public class HangingArtBundle
{
    public string CP { get; set; }
    public string Title { get; set; }
    public string Category { get; set; }
    public string AUToolTab { get; set; }
    public List<HangingArtEntry> Art { get; set; }
}

これは C# でエレガントな方法で行うことは可能ですか?

4

1 に答える 1

6

System.Reflectionこれに使用できます

 private string GetField(HangingArtBundle hab, string property)
 {
    return (string)hab.GetType().GetProperty(property).GetValue(hab, null);
 }

ここに画像の説明を入力

または、生活を少し楽にする拡張メソッドかもしれません。

    public static class Extensions
    {
        public static string GetField(this HangingArtBundle hab, string property)
        {
            if (hab.GetType().GetProperties().Any(p => p.Name.Equals(property)))
            {
                return (string)hab.GetType().GetProperty(property).GetValue(hab, null);
            }
            return string.Empty;
        }
    }

使用法:

  string result = bundle.GetField("CP");
于 2012-12-04T02:25:39.160 に答える