请不要告诉我改用enum。如何检查“testStr”是否在结构“供应商”中?
public struct Supplier {
public const string
NA = "N/A",
companyA = "companyA",
companyB = "companyB";
}
string testStr = "companyA";
答案 0 :(得分: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";
};
答案 1 :(得分:2)
这应该这样做
string toSearch = "companyA";
var hasField = typeof(Supplier).GetFields(BindingFlags.Public | BindingFlags.Static).
Select(x => x.GetRawConstantValue().ToString()).Contains(toSearch);
答案 2 :(得分:1)
您可以构造一个数组,并使用LINQ进行搜索:
if (new[] {Supplier.NA, Supplier.companyA, Supplier.companyB}.Contains(testStr)) {
...
}
在旁注中,我假设您意识到定义struct Supplier
的方式非常不正统(这是最礼貌的方式),因为它没有字段,只有常量。
答案 3 :(得分:0)
您需要使用reflextion来检索结构的成员名称。 这很容易:
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;
}
希望这会对你有所帮助,正如你从不同的答案中看到的那样,在反思中有很多选择。
答案 4 :(得分:0)
虽然这本身并没有回答你的问题,但我开始时的想法和你的想法类似但是把它转移到别的地方。反射比你想要的慢(至少对我而言),所以我没有使用反射来解决我的问题,而是将原始结构恢复为字符串列表(如果值的数量是常数,则将字符串数组恢复)并使用包含扩展方法。
这是一个简单的一个班轮。它简化了搜索代码,同时不会增加内存消耗,也不会增加复杂性(根据我的计算,它比使用反射更快)。
所以基本上你的枚举将有一个包含三个字符串的数组。您需要记住数组中的哪个是哪个,然后只需调用Array.Contains
方法来检查该数组中是否存在该字符串