0

在牛肉文档的扩展页面上,它说:

扩展可用于将接口一致性添加到您无法控制的类型(即:系统类型或在另一个库中定义的类型)。

不幸的是,它没有提供该用例的示例,我不知道如何继续。

假设我有一个界面IFooBarable

interface IFooBarable
{
    void FooBar();
} 

我想将此扩展方法添加到系统库类型中System.DateTime

namespace System
{
    extension DateTime
    {
        public void FooBar()
        {
            String s = scope .();
            ToLongTimeString(s);

            Console.WriteLine("This dateTime ({}) has FooBarred", s); 
        }
    }
}

...这样 DateTime 可以实现IFooBarable

是否应该有一种方法可以告诉编译器将DateTime其视为 的实现IFooBarable?例如,这样编译:

using System;

interface IFooBarable
{
    void FooBar();
}

/* extension code here */

namespace Program
{
    public class Program
    {
        static void Main()
        {
            IFooBarable t = DateTime.Now;

            t.FooBar();
        }
    }
}
4

1 回答 1

0

事实证明,它就像使用与在类声明中指示实现的语法一样简单。也就是说,您需要做的就是使用extension DateTime : IFooBarable

using System;

interface IFooBarable
{
    void FooBar();
}

namespace System
{
    extension DateTime : IFooBarable
    {
        public void FooBar()
        {
            String s = scope .();
            ToLongTimeString(s);

            Console.WriteLine("This dateTime ({}) has FooBarred", s); 
        }
    }
}

namespace Program
{
    public class Program
    {
        static void Main()
        {
            IFooBarable t = DateTime.Now;

            t.FooBar();
        }
    }
}

您甚至可以这样做来注册一个类已经拥有的方法作为同名接口方法的实现,方法是在 中不包含任何内容extension

using System;

interface IFooBarable
{
    void ToLongTimeString();
}

namespace System
{
    extension DateTime : IFooBarable
    {
    }
}

namespace Program
{
    public class Program
    {
        static void Main()
        {
            IFooBarable t = DateTime.Now;

            String s = scope .(); 
            t.ToLongTimeString(s);

            Console.WriteLine("{}", s);
        }
    }
}
于 2020-01-16T03:54:26.793 回答