请不要告诉我使用enum来代替。如何检查“testStr”是否在struct“Supplier”中?如何检查常量中是否存在字符串
public struct Supplier {
public const string
NA = "N/A",
companyA = "companyA",
companyB = "companyB";
}
string testStr = "companyA";
请不要告诉我使用enum来代替。如何检查“testStr”是否在struct“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";
};
看起来不错!很多。 – Bill 2012-07-30 17:44:15
您可以构建一个数组,并使用LINQ查询它:
if (new[] {Supplier.NA, Supplier.companyA, Supplier.companyB}.Contains(testStr)) {
...
}
在一个侧面说明,我以为你知道,在定义struct Supplier
的方式是高度非正统的(这是最有礼貌的方式),因为它没有字段,只有常量。
什么是定义它的“正统”方式?我有点像使用下拉列表可能的值使用它。 – Bill 2012-07-31 19:38:35
@YongkeBillYu处理用户可见字符串常量的一种更为典型的方式是'enum'和资源文件或自定义属性的组合,它们将常量与用户可见字符串配对。 – dasblinkenlight 2012-07-31 19:45:32
这应该这样做
string toSearch = "companyA";
var hasField = typeof(Supplier).GetFields(BindingFlags.Public | BindingFlags.Static).
Select(x => x.GetRawConstantValue().ToString()).Contains(toSearch);
您需要使用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;
}
希望这会帮助你,你可以从不同的答案看到有很多的选项reflextions avaliable。
虽然这本身并不能回答你的问题,但我从一开始就有一个和你的想法类似的想法,但把它转移到了别的东西上。反射比你想要的要慢(至少对我来说),所以不用反射来解决我的问题,而是将原始结构恢复为字符串列表(或者如果值的数量是常量,则返回字符串数组)包含扩展方法。
这是一个简单的单线程。它简化了你的搜索代码,同时不会增加你的内存消耗,也不会增加你的复杂性(根据我的计算,它比使用反射更快)。
所以基本上你的枚举将有一个三串的数组。您需要记住哪个是阵列中的哪个,然后只需拨打Array.Contains
方法来检查您在该阵列中是否存在字符串
您究竟想在此实现什么? – ken2k 2012-07-30 16:44:27
你的意思是**属性值**('供应商'类)等于'testStr'常量吗? – 2012-07-30 16:44:44
当你在问题中说'常数'时,你的意思是结构的属性?你什么意思? – Jodrell 2012-07-30 16:47:02