枚举扩展方法不能调用

Enum extension method can not be called

提问人:Aleksandar 提问时间:10/10/2023 更新时间:10/10/2023 访问量:59

问:

我想优雅地为我创建一个扩展方法,以将值打印为字符串。我写了以下静态扩展方法:Enum

public enum Genre
{
    Action,
    Thriller,
    Comedy,
    Drama,
    Horror,
    SciFi,
}

public static class Extensions
{
    public static string StringBuilder(this Genre g)
    {
        switch (g)
        {
            case Genre.Action: return $"Action";
            case Genre.Thriller: return $"Thriller";
            case Genre.Comedy: return $"Comedy";
            case Genre.Drama: return $"Drama";
            case Genre.Horror: return $"Horror";
            case Genre.SciFi: return $"SciFi";
            default: return "";
        }
    }
}

扩展方法在另一个类中调用:

public class MovieItem
{
    public string? Title { get; }
    public int? RunningTimeMinutes { get; }
    public Enum Genre { get; }

    public MovieItem(string title, int runningTimeMinutes, Genre genre)
    {
        Title = title;
        RunningTimeMinutes = runningTimeMinutes;
        Genre = genre;
    }


    public override string ToString()
    {
        return $"Titel = {Title}, Varighed = {RunningTimeMinutes}, Genre = {Genre.StringBuilder(Genre)}";
    }
}

调用生成错误时会出现问题 - 但扩展方法显然采用参数。我错过了什么吗?Genre.StringBuilder(Genre)CS1501 "No overload for method 'StringBuilder' takes 1 arguments"

C# 枚举 扩展方法

评论

0赞 Alexei Levenkov 10/10/2023
这毫无意义 - 你能澄清一下你认为那条线应该做什么吗?还请重新阅读有关发布代码的最小可重现示例指南,因为整个部分不应该存在,并且实际上带有一个元素(即只是)的枚举就足以证明问题。(到目前为止,对我来说看起来像一个错别字,因为扩展是以非常奇怪的方式调用的,并且属性基本上是非类型的)Genre.StringBuilder(Genre)MovieItemAction
0赞 NetMage 10/10/2023
我想你忘记了扩展是如何工作的。当您的第一个参数为 is 且第二个参数为 时。编译器将扩展方法视为第一个参数是隐式的,但您也可以调用它,这样可以清楚地说明为什么它是错误的。Genre.StringBuilder(x)StringBuilder()GenrexExtensions.StringBuilder(Genre, Genre)

答:

1赞 Dima Ordenov 10/10/2023 #1

最有可能的是,您需要更改为 并将扩展称为public Enum Genre { get; }public Genre Genre { get; }Genre.StringBuilder()

评论

0赞 T.S. 10/10/2023
@Aleksandar,不要使用 .net Framework 通用的标识符来命名对象。在这种情况下.StringBuilder 是一种众所周知的常用类型StringBuilder
0赞 Aleksandar 10/10/2023
这解决了我的问题 - 谢谢!为什么我不能用我的论点调用扩展?它是否隐含地知道,正如我在定义下使用的那样,该方法必须应用于所调用的枚举?this
0赞 Dima Ordenov 10/10/2023
你可以这样做.但扩展的特点是可以“扩展”现有的类型功能。您可以在此处阅读更多内容 learn.microsoft.com/en-us/dotnet/csharp/programming-guide/...Extensions.StringBuilder(Genre)
0赞 lidqy 10/10/2023 #2

顺便说一句,按名称格式化枚举成员可以大大减少到这一行:

public static class Extensions
{
    public static string StringBuilder(this Genre g) => Enum.IsDefined(g) ? $"{g:G}" : "";
}

甚至对于任何枚举定义都是完全通用的:

public static class Extensions
{
    public static string GetMemberName<TEnum>(this TEnum e)
      where TEnum : Enum => Enum.IsDefined(e) ? $"{e:G}" : "";
}