Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法使用类扩展方法来支持C#中的接口方法?_C# - Fatal编程技术网

有没有办法使用类扩展方法来支持C#中的接口方法?

有没有办法使用类扩展方法来支持C#中的接口方法?,c#,C#,下面的控制台应用程序已编译,但界面转换在运行时失败。有没有一个简单的方法来实现这一点 namespace ConsoleApplication1 { class Monkey { public string Shock { get { return "Monkey has been shocked."; } } } static class MonkeyExtensionToSupportIWombat { public

下面的控制台应用程序已编译,但界面转换在运行时失败。有没有一个简单的方法来实现这一点

namespace ConsoleApplication1
{
    class Monkey
    {
        public string Shock { get { return "Monkey has been shocked."; } }
    }

    static class MonkeyExtensionToSupportIWombat
    {
        public static string ShockTheMonkey( this Monkey m )
        {
            return m.Shock;
        }
    }

    interface IWombat
    {
        string ShockTheMonkey();
    }

    class Program
    {

        static void Main( string[] args )
        {
            var monkey = new Monkey();
            Console.WriteLine( "Shock the monkey without the interface: {0}", monkey.Shock );
            IWombat wombat = monkey as IWombat;
            Console.WriteLine( "Shock the monkey with the interface: {0}", wombat.ShockTheMonkey() );
            Console.ReadLine();
        }
    }
}

由于Monkey没有实现IWombat,演员阵容总是会失败。但这与扩展方法无关。你想做什么?

由于Monkey没有实现IWombat,演员阵容总是会失败。但这与扩展方法无关。你想做什么?

我不是扩展方法方面的专家,但我认为你想做的是混合隐喻的编程等价物。扩展方法的引入基本上是为了让不访问类源的人能够扩展类的功能。通过说某个东西实现了一个接口,您基本上是说您确实可以访问源代码,因此实际上不需要扩展方法。如果作为类的设计者,您希望该类的使用者指定功能,那么让Monkey.ShockTheMonkey调用委托会更合适吗


而且,猴子不是袋熊,猴子也不是袋熊。你的动物学知识肯定需要一些帮助;)

我不是扩展方法方面的专家,但我认为您尝试的是混合隐喻的编程等价物。扩展方法的引入基本上是为了让不访问类源的人能够扩展类的功能。通过说某个东西实现了一个接口,您基本上是说您确实可以访问源代码,因此实际上不需要扩展方法。如果作为类的设计者,您希望该类的使用者指定功能,那么让Monkey.ShockTheMonkey调用委托会更合适吗


而且,猴子不是袋熊,猴子也不是袋熊。你的动物学知识肯定需要一些帮助;)

Monkey不是从IWombat派生出来的,所以我不知道为什么您希望它能工作(除了使用反射或动态调用之外,但这是对类设计中的一个基本缺陷的抨击)。 如果您想让它工作,您必须让Monkey实现IWombat,或者让另一个类继承实现IWombat的Monkey(如下所示)


Monkey不是从IWombat派生出来的,所以我不知道为什么你会期望它工作(除了使用反射或动态调用之外,但这是对类设计中的一个基本缺陷的抨击)。 如果您想让它工作,您必须让Monkey实现IWombat,或者让另一个类继承实现IWombat的Monkey(如下所示)


强制转换失败,因为Monkey没有实现IWombat。演员阵容总是失败的


看起来他试图在不实际实现接口的情况下使用接口上的方法。从最纯粹的意义上讲,这是不可能的。他们可能是一些黑客来让它工作,但我认为这是不值得的。

演员阵容失败,因为猴子没有实现IWombat。演员阵容总是失败的



看起来他试图在不实际实现接口的情况下使用接口上的方法。从最纯粹的意义上讲,这是不可能的。他们可能是一些黑客来让它工作,但我认为这不值得。

为什么Monkey不能实现IWombat?好的,那么你想扩展一个密封类。你考虑过包装器类吗?Google/SO应该有很多这样的例子。是的,当然,这就是我要做的。希望避免每次都使用包装器/创建新对象。我认为这将如您所期望的那样工作(扩展方法向Monkey类添加语法上甜美的新方法),但我知道,只要您继续尝试使用接口,它将不会像您所想的那样工作。扩展方法可以与接口一起使用,但也可以很好地扩展类。为什么Monkey不能实现IWombat?好的,那么您想扩展一个密封的类。你考虑过包装器类吗?Google/SO应该有很多这样的例子。是的,当然,这就是我要做的。希望避免每次都使用包装器/创建新对象。我认为这将如您所期望的那样工作(扩展方法向Monkey类添加语法上甜美的新方法),但我知道,只要您继续尝试使用接口,它将不会像您所想的那样工作。扩展方法可以用于接口,但也可以很好地扩展类。这会导致编译错误。这就是我希望能够做到的——通过向扩展类添加接口方法,让Monkey支持IWombat。这会导致编译错误。这就是我希望能够做到的——通过向扩展类添加接口方法,让Monkey支持IWombat。我不想修改“原始”类的真正原因是因为它根本没有定义——它是一个通用列表。使用MVC,我们已经在各种实体的列表上使用扩展方法。我不想修改“原始”类的真正原因是因为它根本没有定义——它是一个通用列表。使用MVC,我们已经在各种实体的列表上使用扩展方法。我想在这里遵循这种模式,而不是创建一些包装器。请参阅我对Jim答案的评论,了解我为什么不想这样做。@dudeNumber4:事先提供的额外信息会非常有用。IEnumerable工作的扩展方法很好;您在使用它们时遇到问题了吗?扩展方法本身工作正常,但扩展类本身不支持接口(我的原始代码片段应该是“静态类MonkeExtensionSupportIwombat:IWombat”)。这不会编译b/c a st
class Monkey
{
    public string Shock { get { return "Monkey has been shocked."; } }
}

static class MonkeyExtensionToSupportIWombat
{
    public static string ShockTheMonkey(this Monkey m)
    {
        return m.Shock;
    }
}

interface IWombat
{
    string ShockTheMonkey();
}

class MonkeyBat : Monkey, IWombat
{
    #region IWombat Members

    public string ShockTheMonkey()
    {
        return this.Shock;
    }

    #endregion
}

class Program
{

    static void Main(string[] args)
    {
        var monkey = new Monkey();
        Console.WriteLine("Shock the monkey without the interface: {0}", monkey.Shock);

        var monkeyBat = new MonkeyBat();
        Console.WriteLine("Shock the monkey with the interface: {0}", monkeyBat.ShockTheMonkey());

        Console.ReadLine();
    }
}