为什么我不能“看到”这个枚举扩展方法?

时间:2010-07-20 07:07:57

标签: c# extension-methods enums

为什么我看不到这个枚举扩展方法? (我想我会疯了)。

File1.cs

namespace Ns1
{
    public enum Website : int
    {
        Website1 = 0,
        Website2
    }
}

File2.cs

using Ns1;

namespace Ns2
{
    public class MyType : RequestHandler<Request, Response>
    {                        
        public override Response Handle(Request request,                                       CRequest cRequest)
        {
            //does not compile, cannot "see" ToDictionary
            var websites = Website.ToDictionary<int>(); 

            return null;
        }
    }


    //converts enum to dictionary of values
    public static class EnumExtensions
    {        
        public static IDictionary ToDictionary<TEnumValueType>(this Enum e)
        {                        
            if(typeof(TEnumValueType).FullName != Enum.GetUnderlyingType(e.GetType()).FullName) throw new ArgumentException("Invalid type specified.");

            return Enum.GetValues(e.GetType())
                        .Cast<object>()
                        .ToDictionary(key => Enum.GetName(e.GetType(), key), 
                                      value => (TEnumValueType) value);            
        }
    }
}

4 个答案:

答案 0 :(得分:15)

您试图将扩展方法作为类型的静态方法而不是作为该类型对象的实例方法。不支持使用扩展方法。

如果您有实例,则会找到扩展方法:

Website website = Website.Website1;
var websites = website.ToDictionary<int>();

答案 1 :(得分:2)

this Enum e指的是枚举实例,而网站实际上是枚举类型。

答案 2 :(得分:2)

扩展方法只是syntactic sugaronly work with instances and not with the type。因此,您必须在类型Website的实例上调用扩展方法,而不是类型本身,如Mark所述。

为了您的信息,除了Mark所说的,代码在编译时转换如下。

//Your code
Website website = new Website();
var websites = website.ToDictionary<int>();


//After compilation.
Website website = new Website();
var websites = EnumExtensions.ToDictionary<int>(website);

扩展方法的improved version将仅扩展类型网站,而不是扩展枚举。

//converts enum to dictionary of values
public static class EnumExtensions
{        
    public static IDictionary ToDictionary<TEnumValueType>(this Website e)
    {                        
        if(typeof(TEnumValueType).FullName != Enum.GetUnderlyingType(e.GetType()).FullName) throw new ArgumentException("Invalid type specified.");

        return Enum.GetValues(e.GetType())
                    .Cast<object>()
                    .ToDictionary(key => Enum.GetName(e.GetType(), key), 
                                  value => (TEnumValueType) value);            
    }
}

答案 3 :(得分:0)

您需要更改扩展方法的签名以使用您的枚举,而不是枚举类型本身。也就是说,在您的扩展程序签名中将Enum更改为Website

public static IDictionary ToDictionary<TEnumValueType>(this Website enum, ...)