tgoop.com/unsafecsharp/237
Create:
Last Update:
Last Update:
where T
Давайте представим ситуацию, нам нужно реализовать 2 метода с одинаковой сигнатурой, но фильтровать разные интерфейсы:
public interface I1 {}
public interface I2 {}
public class MyClass {
public void Method<T>() where T : struct, I1 {}
public void Method<T>() where T : struct, I2 {}
}
Такой код не скомпилится, т.к. сигнатуры методов одинаковые, разные только условия выбора.
Как можно это исправить? Самый простой вариант - объявить методы с разными именами:
Method1<T>
Method2<T>
Но с ростом количества вариантов придется каждый раз придумывать имена, а тем, кто используют эти методы, придется подбирать варианты имен.
Что делать?
Объявляем наши интерфейсы и класс:
public interface I1 {}
public interface I2 {}
public class MyClass {}
Пишем два экстеншена:
public static class MyClassExt1 {
public static void Method<T>(this MyClass obj) where T : struct, I1 {}
}
public static class MyClassExt2 {
public static void Method<T>(this MyClass obj) where T : struct, I2 {}
}
И вуаля 🙂 На самом деле в большинстве случаев такой хак будет работать, т.к. компилятор по сути будет считать, что это 2 разных класса (MyClassExt1, MyClassExt2) и в них объявлены свои методы. А при компиляции они все равно развернутся в Method_I1, Method_I2 и не будут никаким образом мешать друг другу.
#lifehack #csharp
BY Unity: Всё, что вы не знали о разработке
Share with your friend now:
tgoop.com/unsafecsharp/237