Нет способа определить структурные типы, которые имеют определенную функцию.Существует библиотека, в которую добавлена поддержка Duck Typing для C #, которую можно найти здесь .
Это пример из проекта Duck Typing.Пожалуйста, обратите внимание, что типизирование утки происходит во время выполнения и может дать сбой .Насколько я понимаю, эта библиотека генерирует прокси-серверы для типов, которые являются типизированными по типу утки, что далеко от элегантной поддержки во время компиляции, которой пользуется в Scala.Скорее всего, это так же хорошо, как и с этим поколением C #.
public interface ICanAdd
{
int Add(int x, int y);
}
// Note that MyAdder does NOT implement ICanAdd,
// but it does define an Add method like the one in ICanAdd:
public class MyAdder
{
public int Add(int x, int y)
{
return x + y;
}
}
public class Program
{
void Main()
{
MyAdder myAdder = new MyAdder();
// Even though ICanAdd is not implemented by MyAdder,
// we can duck cast it because it implements all the members:
ICanAdd adder = DuckTyping.Cast<ICanAdd>(myAdder);
// Now we can call adder as you would any ICanAdd object.
// Transparently, this call is being forwarded to myAdder.
int sum = adder.Add(2, 2);
}
}
Это способ C # добиться того же, используя хорошие старые интерфейсы.
interface IPressable {
void Press();
}
class Foo {
void Bar(IPressable pressable) {
pressable.Press();
}
}
class Thingy : IPressable, IPushable, etc {
public void Press() {
}
}
static class Program {
public static void Main() {
pressable = new Thingy();
new Foo().Bar(pressable);
}
}