相关疑难解决方法(0)

C# 类可以从其自己的实现中调用接口的默认接口方法吗?

如果我有一个像这样的默认接口方法:

public interface IGreeter
{
    void SayHello(string name) => System.Console.WriteLine($"Hello {name}!");
}
Run Code Online (Sandbox Code Playgroud)

我可以让我的具体实现调用该默认方法吗?

public class HappyGreeter : IGreeter
{
    public void SayHello(string name)
    {
        // what can I put here to call the default method?
        System.Console.WriteLine("I hope you're doing great!!");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以调用:

var greeter = new HappyGreeter() as IGreeter;
greeter.SayHello("Pippy");
Run Code Online (Sandbox Code Playgroud)

结果如下:

// Hello Pippy!
// I hope you're doing great!!
Run Code Online (Sandbox Code Playgroud)

事实上,从实现类中调用 C# 接口默认方法表明我可以调用我的类未实现的方法,但正如预期的那样,添加对((IGreeter)this).SayHello(name);内部的调用HappyGreeter.SaysHello会导致堆栈溢出。

c# c#-8.0 default-interface-member

13
推荐指数
1
解决办法
1806
查看次数

C#如何将"插件"类"插件"注入服务类?

我正在尝试使用下图(问题的结尾)实现类似于我想要展示的想法.

一切都是从课程开始编码abstract class BaseDoSomething.

我的"服务"需要向消费者提供服务已"注册"的"DoSomethings"类型的"动作",此时我看到自己在服务类上重复(复制/粘贴)以下逻辑:

public async Task<Obj1<XXXX>> DoSomething1(....params....)
        {
            var action = new DoSomething1(contructParams);
            return await action.Go(....params....);
        }
Run Code Online (Sandbox Code Playgroud)

我想知道C#中是否还有以不同方式"注册"我想要的所有"DoSomething"?更动态,更少"复制/粘贴",同时在我的消费者类中提供"intellisense"?Somekind为该服务"注入"已接受的"DoSomething"列表.

更新#1 在阅读PanagiotisKanavos关于MEF和检查IoC的其他选项的消息后,我无法找到我正在寻找的确切内容.

我的目标是让我的Service1类(和所有类似的)表现得像一个DynamicObject但是接受的方法是在它自己的构造函数上定义的(我在其中指定DoSomethingX我提供的方法调用.)

示例:我有几个操作(DoSomethingX)作为"BuyCar","SellCar","ChangeOil","StartEngine"等....现在,我想创建一个服务"CarService",只应该提供动作"StartEngine "和"SellCar",而我可能还有其他"服务"与"行动"的其他组合.我想在每个服务的构造函数中定义这个逻辑.然后,在消费者类中,我只想做类似的事情:

var myCarService = new CarService(...paramsX...);
var res1 = myCarService.StartEngine(...paramsY...);
var res2 = myCarService.SellCar(...paramsZ...);
Run Code Online (Sandbox Code Playgroud)

当我使用"CarService"时,我想提供intellisense ....

总结:目标是如何在每个服务中"注册"哪些方法由他提供,给出一个"DoSomethingX"列表,并自动提供它们作为"方法"......我希望我能够解释我的客观/ 愿望.

换句话说:我只是想能够说,我的课Service1是"提供"的行动DoSomething1, DoSomething2DoSomething3,但与最低线成为可能.不知何故使用类属性的概念,我可以在这里做类似的事情:

// THEORETICAL CODE
[RegisterAction(typeOf(DoSomething1))]
[RegisterAction(typeOf(DoSomething2))]
[RegisterAction(typeOf(DoSomething3))]
public class Service1{
    // NO NEED OF EXTRA …
Run Code Online (Sandbox Code Playgroud)

.net c# design-patterns

11
推荐指数
1
解决办法
299
查看次数

当我在从该接口派生的类中调用它时,为什么需要将“this”转换为在 C# 8.0 中具有默认实现的接口?

我在 .NET Core 3.1 和 C# 8 中有这个简单的控制台程序:

using System;

namespace ConsoleApp34
{

    public interface ITest
    {
        public void test()
        {
            Console.WriteLine("Bye World!");

        }
    }

    public class Test : ITest
    {
        public void CallDefault()
        {
            ((ITest)(this)).test();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var t = new Test();
            t.CallDefault();

        }
    }
}

Run Code Online (Sandbox Code Playgroud)

我不明白为什么演员阵容是必要的 ((ITest)(this)).test();

Test 直接派生自 ITest,因此,根据定义,'this' 是 ITest

谢谢你。

c# .net-core c#-8.0 default-interface-member

3
推荐指数
1
解决办法
310
查看次数