如果我有一个像这样的默认接口方法:
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会导致堆栈溢出。
我正在尝试使用下图(问题的结尾)实现类似于我想要展示的想法.
一切都是从课程开始编码abstract class Base的DoSomething.
我的"服务"需要向消费者提供服务已"注册"的"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, DoSomething2和DoSomething3,但与最低线成为可能.不知何故使用类属性的概念,我可以在这里做类似的事情:
// 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 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
谢谢你。