2012-07-30 107 views
1

请不要告诉我使用enum来代替。如何检查“testStr”是否在struct“Supplier”中?如何检查常量中是否存在字符串

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

string testStr = "companyA"; 
+1

您究竟想在此实现什么? – ken2k 2012-07-30 16:44:27

+0

你的意思是**属性值**('供应商'类)等于'testStr'常量吗? – 2012-07-30 16:44:44

+1

当你在问题中说'常数'时,你的意思是结构的属性?你什么意思? – Jodrell 2012-07-30 16:47:02

回答

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"; 
}; 
+0

看起来不错!很多。 – Bill 2012-07-30 17:44:15

1

您可以构建一个数组,并使用LINQ查询它:

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

在一个侧面说明,我以为你知道,在定义struct Supplier的方式是高度非正统的(这是最有礼貌的方式),因为它没有字段,只有常量。

+0

什么是定义它的“正统”方式?我有点像使用下拉列表可能的值使用它。 – Bill 2012-07-31 19:38:35

+0

@YongkeBillYu处理用户可见字符串常量的一种更为典型的方式是'enum'和资源文件或自定义属性的组合,它们将常量与用户可见字符串配对。 – dasblinkenlight 2012-07-31 19:45:32

2

这应该这样做

string toSearch = "companyA"; 
      var hasField = typeof(Supplier).GetFields(BindingFlags.Public | BindingFlags.Static). 
       Select(x => x.GetRawConstantValue().ToString()).Contains(toSearch); 
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; 
} 

希望这会帮助你,你可以从不同的答案看到有很多的选项reflextions avaliable。

0

虽然这本身并不能回答你的问题,但我从一开始就有一个和你的想法类似的想法,但把它转移到了别的东西上。反射比你想要的要慢(至少对我来说),所以不用反射来解决我的问题,而是将原始结构恢复为字符串列表(或者如果值的数量是常量,则返回字符串数组)包含扩展方法。

这是一个简单的单线程。它简化了你的搜索代码,同时不会增加你的内存消耗,也不会增加你的复杂性(根据我的计算,它比使用反射更快)。

所以基本上你的枚举将有一个三串的数组。您需要记住哪个是阵列中的哪个,然后只需拨打Array.Contains方法来检查您在该阵列中是否存在字符串

相关问题