TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.7K subscribers
Post #7270 2.28K
🦆 Duck typing в C# — почти как в TypeScript

В TypeScript достаточно, чтобы у объекта был нужный метод:


function foo(a: { Do(): void }) {
a.Do();
}


🔜 В C# так напрямую нельзя:


class A
{
public void Do() => Console.WriteLine("A.Do");
}

class B
{
public void Do() => Console.WriteLine("B.Do");
}


🔜 У A и B нет общего интерфейса. Но хочется вызвать:


Foo(new A());
Foo(new B());


И здесь на сцену выходят interceptors — экспериментальная возможность компилятора C#.

🌞 Идея:


[DuckShape]
public interface IDoable
{
void Do();
}

public static partial class Ops
{
[DuckTyped]
public static void Foo(IDoable value)
=> value.Do();
}


📍 Source generator создаёт адаптер:


internal readonly struct ShapeAdapter_IDoable_A : IDoable
{
private readonly A _value;

public ShapeAdapter_IDoable_A(A value)
=> _value = value;

public void Do() => _value.Do();
}


А interceptor подменяет вызов и оборачивает A или B в подходящий адаптер.

🔴 В итоге:


Ops.Foo(new A()); // A.Do
Ops.Foo(new B()); // B.Do


Работает и с properties — например, можно описать INameable с Name { get; set; }, а затем передать обычный Person, не меняя его код.

⚠️ Но это скорее интересный PoC, чем готовая замена интерфейсам:

— interceptors остаются экспериментальной возможностью;
— нужен source generator;
— есть ограничения и не покрытые edge cases;
— появляется дополнительная магия на этапе компиляции.

🔗 Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#sharp_view
  • 🔥 4
  • ❤ 2
  • 👍 2
More from @csharpproglib
  1. Sep 20, 2026💪 Разминка перед трудовыми буднями Что произойдёт? ❤️ — список станет [1, 3] 🔥 — Invalid…
  2. Sep 19, 2026🧩 Middleware в ASP.NET Core: 3 ловушки Middleware — звено HTTP pipeline: app.Use(async (c…
  3. Sep 18, 2026📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #garbage_collector
  4. Sep 17, 2026🧠 Почему .NET-под съедает всю память? kubectl top pod показывает 1 ГБ, а managed heap зан…
  5. Sep 15, 2026🧑‍💻 Забытый await: от race condition до DoS-атаки В C# ключевое слово async — это инстру…
  6. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →