【问题标题】:Why getting error Extension method must be defined in a top level static class? [duplicate]为什么必须在顶级静态类中定义扩展方法? [复制]
【发布时间】:2016-06-22 09:03:29
【问题描述】:

在 form1 中我添加了两个类

public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter)) return this;
        return null;
    }

    private const string fileSizeFormat = "fs";
    private const Decimal OneKiloByte = 1024M;
    private const Decimal OneMegaByte = OneKiloByte * 1024M;
    private const Decimal OneGigaByte = OneMegaByte * 1024M;

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (format == null || !format.StartsWith(fileSizeFormat))
        {
            return defaultFormat(format, arg, formatProvider);
        }

        if (arg is string)
        {
            return defaultFormat(format, arg, formatProvider);
        }

        Decimal size;

        try
        {
            size = Convert.ToDecimal(arg);
        }
        catch (InvalidCastException)
        {
            return defaultFormat(format, arg, formatProvider);
        }

        string suffix;
        if (size > OneGigaByte)
        {
            size /= OneGigaByte;
            suffix = "GB";
        }
        else if (size > OneMegaByte)
        {
            size /= OneMegaByte;
            suffix = "MB";
        }
        else if (size > OneKiloByte)
        {
            size /= OneKiloByte;
            suffix = "kB";
        }
        else
        {
            suffix = " B";
        }

        string precision = format.Substring(2);
        if (String.IsNullOrEmpty(precision)) precision = "2";
        return String.Format("{0:N" + precision + "}{1}", size, suffix);

    }

    private static string defaultFormat(string format, object arg, IFormatProvider formatProvider)
    {
        IFormattable formattableArg = arg as IFormattable;
        if (formattableArg != null)
        {
            return formattableArg.ToString(format, formatProvider);
        }
        return arg.ToString();
    }

}

public static class ExtensionMethods
{
    public static string ToFileSize(this long l)
    {
        return String.Format(new FileSizeFormatProvider(), "{0:fs}", l);
    }
}

然后我像这样使用它:

FileInfo fi = new FileInfo(ListViewCostumControl.lvnf.Items[ListViewCostumControl.lvnf.SelectedIndices[0]].Text);
label17.Text = ExtensionMethods.ToFileSize(fi.Length);

但是在 ToFilesize 上的 ExtensionMethods 类上出现错误:

错误1 扩展方法必须定义在顶级静态类中; ExtensionMethods 是一个嵌套类

【问题讨论】:

  • 您在此处发布的代码与错误消息不匹配。您能向我们展示代码所在的整个 CS 文件吗?
  • @מני מנחם 是否有“以上”类 FileSizeFormatProvider
  • @nozzleman 是的,但它不是直接在 FileSizeFormatProvider 类之上,之前有一些方法。
  • 您需要正确定义该扩展方法(在顶级静态类中)。或者删除“this”关键字,以您当前的方式将其用作常规帮助方法。

标签: c# .net winforms


【解决方案1】:

C# 语言不允许您从嵌套类中定义扩展方法,请参阅 Why are extension methods only allowed in non-nested, non-generic static class?

根据cmets中的讨论,问题应该通过以下方法解决:

导致此错误的结构

public class SomeTopClass
{

    // ...

    public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
    {
        // ...
    }

    // class is in SomeClass, therefore it is a nested class. You cannot define extension mathods here
    public static class ExtensionMethods
    {
        public static string ToFileSize(this long l)
        {
            return String.Format(new FileSizeFormatProvider(), "{0:fs}", l);
        }
    }
}

防止此错误的结构

public class SomeTopClass
{

    // ...

    public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
    {
        // ...
    }           
}


// now you can, because it is not nested inside some other class
public static class ExtensionMethods
{
    public static string ToFileSize(this long l)
    {
        // note the SomeTopClass before FileSizeFormatProvider!!
        return String.Format(new SomeTopClass.FileSizeFormatProvider(), "{0:fs}", l);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多