请不要告诉我改用枚举。如何检查“testStr”是否在结构“供应商”中?
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;
}
希望这会对您有所帮助,正如您从不同的答案中看到的那样,反射中有很多可用的选项。
尽管这本身并不能回答您的问题,但我从与您的想法相似的想法开始,但将其转移到了其他东西。反射比你可能想要的要慢(至少对我来说),所以我没有使用反射来解决我的问题,而是将原始结构恢复为字符串列表(如果值的数量是恒定的,则为字符串数组)并使用包含扩展方法。
它是一个简单的单列。它简化了您的搜索代码,同时不会增加您的内存消耗,也不会增加您的复杂性(根据我的计算,它比使用反射更快)。
所以基本上你的枚举将有一个三个字符串的数组。您需要记住哪个是数组中的哪个,然后只需调用Array.Contains
方法来检查您拥有的字符串是否存在于该数组中