假设我们已定义Planets
枚举:
public enum Planets
{
Sun = 0,
Mercury=5,
Venus,
Earth,
Jupiter,
Uranus,
Neptune
}
我使用Enum.IsDefined
方法来查找字符串是否存在于枚举中。
Enum.IsDefined(typeof(Planets), "Mercury"); // result is true
但是,然后我尝试了这个并且它也返回了真实:
Enum.IsDefined(typeof(Planets), 5); // result is true again
怎么样,它来了吗?这种方法没有任何过载。它只有一个签名:
Enum.IsDefined(Type enumType, object value);
Enum.IsDefined
为什么以及如何搜索名称和值?这对我来说真的很有趣,为什么他们这样选择? IMO制造超载是更好的选择,不是吗?
答案 0 :(得分:11)
值参数可以是以下任何:
- 任何类型为enumType的成员。
- 一个变量,其值为enumType类型的枚举成员。
- 枚举成员名称的字符串表示形式。字符串中的字符必须与枚举具有相同的大小写 会员名称。
- enumType的基础类型的值。
我相信这就是为什么它没有过载并将object
作为第二个参数。由于此方法将object
作为第二个参数 - 而object
是所有.NET类型的基类 - 您可以传递string
或int
等等。
此处方法implemented;
public static bool IsDefined(Type enumType, Object value)
{
if (enumType == null)
throw new ArgumentNullException("enumType");
return enumType.IsEnumDefined(value);
}
看起来这个虚拟的Type.IsEnumDefined
方法可以处理所有这些情况,例如implementation;
public virtual bool IsEnumDefined(object value)
{
if (value == null)
throw new ArgumentNullException("value");
if (!IsEnum)
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType");
Contract.EndContractBlock();
// Check if both of them are of the same type
Type valueType = value.GetType();
// If the value is an Enum then we need to extract the underlying value from it
if (valueType.IsEnum)
{
if (!valueType.IsEquivalentTo(this))
throw new ArgumentException(Environment.GetResourceString("Arg_EnumAndObjectMustBeSameType", valueType.ToString(), this.ToString()));
valueType = valueType.GetEnumUnderlyingType();
}
// If a string is passed in
if (valueType == typeof(string))
{
string[] names = GetEnumNames();
if (Array.IndexOf(names, value) >= 0)
return true;
else
return false;
}
// If an enum or integer value is passed in
if (Type.IsIntegerType(valueType))
{
Type underlyingType = GetEnumUnderlyingType();
// We cannot compare the types directly because valueType is always a runtime type but underlyingType might not be.
if (underlyingType.GetTypeCodeImpl() != valueType.GetTypeCodeImpl())
throw new ArgumentException(Environment.GetResourceString("Arg_EnumUnderlyingTypeAndObjectMustBeSameType", valueType.ToString(), underlyingType.ToString()));
Array values = GetEnumRawConstantValues();
return (BinarySearch(values, value) >= 0);
}
}
答案 1 :(得分:2)