1

代わりに列挙型を使用するように言わないでください。「testStr」が構造体「Supplier」にあるかどうかを確認するにはどうすればよいですか?

public struct Supplier {
    public const string
        NA = "N/A",
        companyA = "companyA",
        companyB = "companyB";
}

string testStr = "companyA";
4

5 に答える 5

4

これは、リフレクションを介して実現できます。

void Main()
{
  // make sure that we only take public static const
  string phrase = "companyA";
  var fields = typeof(Supplier).GetFields(BindingFlags.Static | BindingFlags.Public).Where(i => i.IsLiteral);
  foreach (FieldInfo field in fields)
  {
    string val = field.GetRawConstantValue().ToString();
    string msg = string.Format("is '{0}' equal to '{1}' => {2}", val, phrase, val == phrase);
    Console.WriteLine(msg);
  }
}

// Define other methods and classes here
public struct Supplier {
    public const string
        NA = "N/A",
        companyA = "companyA",
        companyB = "companyB";
};
于 2012-07-30T16:51:50.560 に答える
2

これはそれを行う必要があります

  string toSearch = "companyA";
            var hasField = typeof(Supplier).GetFields(BindingFlags.Public | BindingFlags.Static).
                Select(x => x.GetRawConstantValue().ToString()).Contains(toSearch);
于 2012-07-30T16:53:12.717 に答える
1

配列を作成し、LINQを使用してそれを検索できます。

if (new[] {Supplier.NA, Supplier.companyA, Supplier.companyB}.Contains(testStr)) {
    ...
}

struct Supplierちなみに、フィールドがなく、定数しかないため、の定義方法が非常に非正統的である(これが最も丁寧な言い方です)ことをご存知だと思います。

于 2012-07-30T16:49:02.293 に答える
0

構造体のメンバー名を取得するには、再帰を使用する必要があります。それは非常に簡単です:

using System.Reflextion;

static void Main()
{
    if (MemberExists(typeof(Supplier), testStr))
        Console.WriteLine(testStr + " exists in Supplier");
    else
        Console.WriteLine(testStr + " does not exists in Supplier");
}

public bool MemberExists(Type structure, string name)
{
    foreach(MemberInfo member in structure.GetMembers())
        if (member.Name == name) return true;
    return false;
}

別の答えからわかるように、これがお役に立てば幸いです。反射には多くのオプションがあります。

于 2012-07-30T16:56:17.970 に答える
0

これはあなたの質問自体には答えませんが、私はあなたと同じような考えから始めましたが、それを別のものに移しました。リフレクションは(少なくとも私にとっては)あなたが望むものよりも少し遅いので、リフレクションを使用して問題を解決する代わりに、元の構造体を文字列のリスト(または値の数が一定の場合は文字列の配列)に戻し、使用しました包含拡張メソッド。

シンプルなワンライナーです。これにより、メモリ消費量や複雑さを増やさずに検索コードを簡素化できます(私の計算によれば、リフレクションを使用するよりも高速です)。

したがって、基本的に列挙型には3つの文字列の配列があります。配列内のどれであるかを覚えてから、Array.Containsメソッドを呼び出して、その配列に文字列が存在するかどうかを確認する必要があります。

于 2016-01-25T08:39:41.160 に答える