1

请不要告诉我改用枚举。如何检查“testStr”是否在结构“供应商”中?

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

string testStr = "companyA";
4

5 回答 5

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";
};
于 2012-07-30T16:51:50.560 回答
2

这应该这样做

  string toSearch = "companyA";
            var hasField = typeof(Supplier).GetFields(BindingFlags.Public | BindingFlags.Static).
                Select(x => x.GetRawConstantValue().ToString()).Contains(toSearch);
于 2012-07-30T16:53:12.717 回答
1

您可以构造一个数组,并使用 LINQ 来搜索它:

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

顺便说一句,我假设您意识到struct Supplier定义的方式是非常非正统的(这是最礼貌的说法),因为它没有字段,只有常量。

于 2012-07-30T16:49:02.293 回答
0

您需要使用反射来检索结构的成员名称。这很容易:

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;
}

希望这会对您有所帮助,正如您从不同的答案中看到的那样,反射中有很多可用的选项。

于 2012-07-30T16:56:17.970 回答
0

尽管这本身并不能回答您的问题,但我从与您的想法相似的想法开始,但将其转移到了其他东西。反射比你可能想要的要慢(至少对我来说),所以我没有使用反射来解决我的问题,而是将原始结构恢复为字符串列表(如果值的数量是恒定的,则为字符串数组)并使用包含扩展方法。

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

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

于 2016-01-25T08:39:41.160 回答