【问题标题】:C# add to class in another DLLC# 添加到另一个 DLL 中的类
【发布时间】:2011-04-28 23:05:32
【问题描述】:

...有可能吗?

例如,我可以添加这个简单的功能吗...

public static double Deg2Rad(double degrees) {
    return Math.PI / 180 * degrees;
}

...到Convert 类? 所以(使用默认的...“usings”)你可以调用

double radians = Convert.Deg2Rad(123);

这可以吗?如果有,怎么做?

【问题讨论】:

    标签: c# class extending-classes


    【解决方案1】:

    不,你不能,但你可以向double 添加一个扩展方法并像这样调用它

    double x = 180.0;
    double y = Math.Cos( x.Deg2Rad() );
    double z = Math.Sin( 0.5.Pi() );
    

    在静态类中添加以下扩展方法:

    public static class ExtensionMethods
    {
        public static double Deg2Rad(this double angle)
        {
            return Math.PI*angle/180.0;
        }
    
        public static double Pi(this double x)
        {
            return Math.PI*x;
        }
    }
    

    【讨论】:

    • 已接受,还有没有办法让它也适用于 int 而无需用 int 重写?
    • 您可以将其转换为双重:x = ((double)i).Pi() 但它很难看。继续为您想要的类型编写扩展。您可以将扩展放在不同的命名空间中,因此根据您使用的using 语句,可以使用不同的扩展。
    【解决方案2】:

    不,这是不可能的。如果Convert 不是static,则可以使用扩展名,但不是。

    不过,您可以使用 this 关键字为 double 添加扩展名:

    public static double Deg2Rad(this double degrees) {
        return Math.PI / 180 * degrees;
    }
    

    然后像这样使用它:

    double radians = (123D).Deg2Rad();
    

    不过,您必须将方法放在 static 类中才能正常工作。

    【讨论】:

      【解决方案3】:

      你可以得到你想要的。 C# 有“扩展方法”。这允许您向另一个类添加方法,即使该类位于另一个您没有源代码的程序集中。但是,您不能将静态函数添加到另一个类。您只能添加实例方法。

      有关详细信息,请参阅MSDN Extensions Methods

      【讨论】:

        【解决方案4】:

        不,你不能,但你真的不需要——你可以只声明你自己的静态类,例如:

        public static class MyConvert
        {
            public static double Deg2Rad(double degrees) 
            {
                return Math.PI / 180 * degrees;
            }
        }
        

        用法:

        double radians = MyConvert.Deg2Rad(123);
        

        (显然MyConvert 是个垃圾名字,但你明白了)。

        上述方法与系统 Convert 类上的方法之间的唯一区别是,如果它在 Convert 类上,它看起来像一个内置函数,但你很难说服我这实际上是一件好事(我想知道何时调用框架代码与内部维护的代码)。

        【讨论】:

          【解决方案5】:

          除了这里所说的,还有另一个选项是Partial classes(这不适用于转换)。

          如果该类被声明为分部,那么您可以通过另一个分部类添加方法,即使它位于另一个程序集 (DLL) 中。

          但是,同样,该类必须最初声明为部分的才能工作。

          【讨论】:

          • 我知道这是旧的,但为了确保其他人不会被此误导,我正在投票并发布一个链接,显示部分类不能跨程序集使用:stackoverflow.com/a/647459/16241
          猜你喜欢
          • 1970-01-01
          • 2020-04-06
          • 2013-10-30
          • 1970-01-01
          • 2010-11-14
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多