假设我有这个枚举:
namespace BusinessRule
{
public enum SalaryCriteria : int
{
[EnumDisplayName(DisplayName = "Per Month")]
Per_Month = 1,
[EnumDisplayName(DisplayName = "Per Year")]
Per_Year = 2,
[EnumDisplayName(DisplayName = "Per Week")]
Per_Week = 3
}
}
我的名字在字符串变量中,如:
string EnumAtt = "SalaryCriteria";
我正在尝试检查此Enum是否由此名称定义,如果已定义我想获取其instance.i已尝试过这样,但type
正在返回null
:
string EnumAtt = "SalaryCriteria";
Type myType1 = Type.GetType(EnumAtt);
我也试过这个:
string EnumAtt = "BusinessRule.SalaryCriteria";
Type myType1 = Type.GetType(EnumAtt);
任何想法如何实现这一点。
答案 0 :(得分:10)
要在当前AppDomain中搜索给定枚举的所有已加载程序集 - 没有完全限定的程序集名称 - 您可以执行以下操作:
public static Type GetEnumType(string enumName)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(enumName);
if (type == null)
continue;
if (type.IsEnum)
return type;
}
return null;
}
例如(选择一个不在我的程序集中的semi-random enum):
var type1 = Type.GetType("System.Xml.Linq.LoadOptions") // Returns null.
var type2 = GetEnumType("System.Xml.Linq.LoadOptions") // Returns successfully.
您的名字仍应包含名称空间。
答案 1 :(得分:3)
LINQ启发的答案:
public static Type GetEnumType(string name)
{
return
(from assembly in AppDomain.CurrentDomain.GetAssemblies()
let type = assembly.GetType(name)
where type != null
&& type.IsEnum
select type).FirstOrDefault();
}
原因是您需要遍历所有已加载的程序集,而不仅仅是当前程序集。
答案 2 :(得分:1)
这对我很有用。
Type myType1 = Type.GetType("BusinessRule.SalaryCriteria");
我试过没有" EnumDisplayName"属性。
答案 3 :(得分:0)
这很有效:
using System;
namespace BusinessRule
{
public enum SalaryCriteria : int
{
Per_Month = 1,
Per_Year = 2,
Per_Week = 3
}
}
namespace ConsoleApplication16
{
internal class Program
{
private static void Main()
{
string EnumAtt = "BusinessRule.SalaryCriteria";
Type myType1 = Type.GetType(EnumAtt);
Console.WriteLine(myType1.AssemblyQualifiedName);
Console.ReadLine();
}
}
}