代わりに列挙型を使用するように言わないでください。「testStr」が構造体「Supplier」にあるかどうかを確認するにはどうすればよいですか?
public struct Supplier {
public const string
NA = "N/A",
companyA = "companyA",
companyB = "companyB";
}
string testStr = "companyA";
これは、リフレクションを介して実現できます。
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";
};
これはそれを行う必要があります
string toSearch = "companyA";
var hasField = typeof(Supplier).GetFields(BindingFlags.Public | BindingFlags.Static).
Select(x => x.GetRawConstantValue().ToString()).Contains(toSearch);
配列を作成し、LINQを使用してそれを検索できます。
if (new[] {Supplier.NA, Supplier.companyA, Supplier.companyB}.Contains(testStr)) {
...
}
struct Supplier
ちなみに、フィールドがなく、定数しかないため、の定義方法が非常に非正統的である(これが最も丁寧な言い方です)ことをご存知だと思います。
構造体のメンバー名を取得するには、再帰を使用する必要があります。それは非常に簡単です:
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;
}
別の答えからわかるように、これがお役に立てば幸いです。反射には多くのオプションがあります。
これはあなたの質問自体には答えませんが、私はあなたと同じような考えから始めましたが、それを別のものに移しました。リフレクションは(少なくとも私にとっては)あなたが望むものよりも少し遅いので、リフレクションを使用して問題を解決する代わりに、元の構造体を文字列のリスト(または値の数が一定の場合は文字列の配列)に戻し、使用しました包含拡張メソッド。
シンプルなワンライナーです。これにより、メモリ消費量や複雑さを増やさずに検索コードを簡素化できます(私の計算によれば、リフレクションを使用するよりも高速です)。
したがって、基本的に列挙型には3つの文字列の配列があります。配列内のどれであるかを覚えてから、Array.Contains
メソッドを呼び出して、その配列に文字列が存在するかどうかを確認する必要があります。