提问人:Aleksandar 提问时间:10/10/2023 更新时间:10/10/2023 访问量:59
枚举扩展方法不能调用
Enum extension method can not be called
问:
我想优雅地为我创建一个扩展方法,以将值打印为字符串。我写了以下静态扩展方法: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"
答:
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}" : "";
}
上一个:覆盖 CSS 的边缘扩展
下一个:关于分机问题和笔记本 7 中断
评论
Genre.StringBuilder(Genre)
MovieItem
Action
Genre.StringBuilder(x)
StringBuilder()
Genre
x
Extensions.StringBuilder(Genre, Genre)