Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 返回父类型的扩展_C# 4.0_Extension Methods - Fatal编程技术网

C# 4.0 返回父类型的扩展

C# 4.0 返回父类型的扩展,c#-4.0,extension-methods,C# 4.0,Extension Methods,我知道我可以通过泛型实现这一点,如下所示,但是我如何构建一个扩展来使用泛型返回父类型呢 通用扩展签名: public static TEnum FromString<TEnum>(this Enum par , string val ) where TEnum : Enum { return (TEnum) Enum.Parse(par.GetType(), val); } 基本上,我有一系列枚举,它们的值被解析为一个进程的字符串,作为接收者,我需要将该字符串值解析为枚举进

我知道我可以通过泛型实现这一点,如下所示,但是我如何构建一个扩展来使用泛型返回父类型呢

通用扩展签名:
public static TEnum FromString<TEnum>(this Enum par , string val ) where TEnum : Enum {
    return (TEnum) Enum.Parse(par.GetType(), val);
}
基本上,我有一系列枚举,它们的值被解析为一个进程的字符串,作为接收者,我需要将该字符串值解析为枚举进行验证。最后,如果
字符串
值不是枚举数中的有效值,它将返回null或
默认值
。事实上,我需要能够返回
枚举器的类型,而无需执行泛型操作


如果不可能,那就是kewl,我想我会尝试在没有泛型的情况下使用扩展逻辑模式来实现它。

简单的答案是否定的,您需要泛型来返回正确的枚举类型。
否则,您将只使用基本的
Enum
类型,而不是枚举的特定类型

您可以创建如下扩展方法:

public static Enum FromString(this Enum par, string val)
{
    return (Enum) Enum.Parse(par.GetType(), val);    
}
但正如您所看到的,您将得到一种“Enum”,而不是您的特定Enum。
另一方面:

Enum val =  default(MyEnum).FromString("SomeEnumValue");
bool isEnum = val is MyEnum; // Returns True
正如您所看到的,
val
属于
MyEnum
类型,isEnum返回
true

这也适用于:

MyEnum val = (MyEnum)default(MyEnum).FromString("SomeEnumValue"); 

简短的回答是否,您需要泛型返回正确的枚举类型。
否则,您将只使用基本的
Enum
类型,而不是枚举的特定类型

您可以创建如下扩展方法:

public static Enum FromString(this Enum par, string val)
{
    return (Enum) Enum.Parse(par.GetType(), val);    
}
但正如您所看到的,您将得到一种“Enum”,而不是您的特定Enum。
另一方面:

Enum val =  default(MyEnum).FromString("SomeEnumValue");
bool isEnum = val is MyEnum; // Returns True
正如您所看到的,
val
属于
MyEnum
类型,isEnum返回
true

这也适用于:

MyEnum val = (MyEnum)default(MyEnum).FromString("SomeEnumValue"); 

你不想用泛型做这件事有什么原因吗?已经把它作为泛型做了,只是想知道是否有可能用扩展作为泛型的一个副作用。你不想用泛型做这件事有什么原因吗?已经把它作为泛型做了,只是想知道是否有可能将扩展作为泛型的一个副作用。太糟糕了,我无法创建泛型,然后在枚举中扩展该泛型。TY用于开箱即用示例。太糟糕了,我无法创建泛型,然后在枚举中扩展该泛型。TY用于开箱即用的示例。