UNSAFECSHARP Telegram 237
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
🔥70👍26🤡1🥴1🫡1



tgoop.com/unsafecsharp/237
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

6How to manage your Telegram channel? Telegram users themselves will be able to flag and report potentially false content. How to Create a Private or Public Channel on Telegram? “[The defendant] could not shift his criminal liability,” Hui said. Hashtags
from us


Telegram Unity: Всё, что вы не знали о разработке
FROM American