如何扩展与C#扩展方法的类?(How do I extend a class with c# ext

2019-06-26 22:04发布

可扩展方法应用于类?

例如,延伸的DateTime到包括可能被调用像明日()方法:

DateTime.Tomorrow();

我知道我可以使用

static DateTime Tomorrow(this Datetime value) { //... }

要么

public static MyClass {
  public static Tomorrow() { //... }
}

对于类似的结果,但我怎么能延长日期时间,这样我可以调用DateTime.Tomorrow?

Answer 1:

除非现有的类型被标记为部分不能添加方法到现有的类型,你可以只添加似乎是通过扩展方法对现有类型的成员方法。 既然是这样的话,因为扩展方法使用该类型的情况下,你不能静态方法添加到该类型本身。

没有什么创建自己的静态辅助方法,这样阻止你:

static class DateTimeHelper
{
    public static DateTime Tomorrow
    {
        get { return DateTime.Now.AddDays(1); }
    }
}

你会使用这样的:

DateTime tomorrow = DateTimeHelper.Tomorrow;


Answer 2:

使用的扩展方法 。

例如:

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
            return date.AddDays(1);
        }    
    }
}

用法:

DateTime.Now.Tomorrow();

要么

AnyObjectOfTypeDateTime.Tomorrow();


Answer 3:

扩展方法是使静态方法,其第一个参数是类型T的外观的实例,就好像他们是在T.实例方法的语法糖

这样的好处在很大程度上失去了,你做“静态扩展方法”,因为它们将有助于混淆代码的读者,甚至比扩展方法更多(因为他们似乎是完全合格的,但不是在类实际上定义)对于没有语法增益(能够在中Linq的流畅风格,例如连锁调用)。

既然你就得将扩展到范围与使用反正我认为它更简单,更安全地创建:

public static class DateTimeUtils
{
    public static DateTime Tomorrow { get { ... } }
}

然后在你的代码通过使用这样的:

WriteLine("{0}", DateTimeUtils.Tomorrow)


Answer 4:

我可以得到答案最接近的是通过添加扩展方法为System.Type对象。 不漂亮,但仍有趣。

public static class Foo
{
    public static void Bar()
    {
        var now = DateTime.Now;
        var tomorrow = typeof(DateTime).Tomorrow();
    }

    public static DateTime Tomorrow(this System.Type type)
    {
        if (type == typeof(DateTime)) {
            return DateTime.Now.AddDays(1);
        } else {
            throw new InvalidOperationException();
        }
    }
}

否则,IMO安德鲁和ShuggyCoUk有一个更好的实现。



Answer 5:

我会做同样的库木

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
           return date.AddDays(1);
        }    
    }
}

但这样调用新的DateTime()明天()。

认为它使更多的作用似乎比DateTime.Now.Tomorrow();



Answer 6:

它们提供了通过增加没有必要的类型修改新的方法来扩展现有类型的能力。 调用使用实例方法语法的应用程序内从扩展类型的对象的方法被称为“”延伸“”的方法。 扩展方法不在类型实例成员。 关键的一点要记住的是扩展方法,定义为静态方法,在范围仅在命名空间中明确通过使用指令导入到你的应用程序源代码。 虽然扩展方法被定义为静态方法,他们使用的实例语法仍称。

这里检查完整的例子http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201

例:

class Extension
    {
        static void Main(string[] args)
        {
            string s = "sudhakar";
            Console.WriteLine(s.GetWordCount());
            Console.ReadLine();
        }

    }
    public static class MyMathExtension
    {

        public static int GetWordCount(this System.String mystring)
        {
            return mystring.Length;
        }
    }


Answer 7:

我一直在寻找类似的东西 - 限制在提供扩展方法的类的列表。 似乎很难找到一个简要清单所以这里有云:

  1. 你不能有任何私人或受保护的任何东西 - 字段,方法等。

  2. 它必须是一个静态类,如public static class...

  3. 只有方法可以在类,而且必须是公共静态的。

  4. 你不能有传统的静态方法 - 那些不包括这种说法是不允许的。

  5. 所有方法都必须开始:

    公共静态返回类型方法(这个类名_this,...)

因此,第一个参数始终是这个参考。

有此创建一个隐含的问题 - 如果添加需要任何形式的锁方法,你真的不能提供它在类级别。 通常,你会提供一个私有的实例级锁,但它不能添加任何私有字段,让你有一些非常尴尬的选择,如提供它作为一些课外公共静等获取冒险。 标志C#语言曾在设计这些类型的坏转 。

解决方法是使用你的扩展方法类只是一个门面到普通班,并都在你的扩展类的静态方法只是调用真正的类,可能使用一个Singleton 。



Answer 8:

不幸的是,你不能这样做。 我相信这将是有益的,但。 它是更自然的类型:

DateTime.Tomorrow

比:

DateTimeUtil.Tomorrow

随着一个实用程序类,你必须检查,而不是一个在两个不同的类的静态方法的存在。



Answer 9:

我们已经改善了我们的详细回答explanation.Now它更容易理解有关扩展方法

扩展方法 :它是通过它我们可以扩展现有类的行为,而不使用子分级或修饰或重新编译原始类或结构的机制。

我们可以扩展我们的自定义类,.NET Framework类等。

扩展方法实际上是一种特殊的是在静态类中定义的静态方法。

随着DateTime类已经采取以上,因此我们没有采取这一类的解释。

下面是例子

//这是仅具有一种方法的现有计算器类(添加)

public class Calculator 
{
    public double Add(double num1, double num2)
    {
        return num1 + num2;
    }

}

// Below is the extension class which have one extension method.  
public static class Extension
{
    // It is extension method and it's first parameter is a calculator class.It's behavior is going to extend. 
    public static double Division(this Calculator cal, double num1,double num2){
       return num1 / num2;
    }   
}

// We have tested the extension method below.        
class Program
{
    static void Main(string[] args)
    {
        Calculator cal = new Calculator();
        double add=cal.Add(10, 10);
        // It is a extension method in Calculator class.
        double add=cal.Division(100, 10)

    }
}


文章来源: How do I extend a class with c# extension methods?