Передать в делегат Func динамический тип

245
27 августа 2017, 02:04

В качестве аргумента у метода нужен делегат Func в котором первый параметр - Type не известен:

class MyClass
{
  void myMethod(Func<?, bool> func){
    //...
  }
}
class OtherClass : MyClass
{
  int par1;
  string par2;
  //...
}

Что-бы можно было воспользоваться мои методом следующим образом: OtherClass.myMethod(o=>o.par1 == 10)

Именно класс "OtherClass" должен как-то попасть как аргумент в Func.

Answer 1

В таком случае метод стоит вынести из базового класса в расширение:

static class MyClassExtensions 
{
    public static void MyMethod<T>(this T obj, Func<T, bool> condition) where T : MyClass
    {
        // ...
    }
}

Если принципиально чтобы метод находился именно в самом классе (например, ему требуется доступ к приватным полям) - надо делать нетипизированный метод в классе и типизированный в расширении:

class MyClass
{
    public void MyMethodImpl(Func<MyClass, bool> condition)
    {
        // ...
    }
}
static class MyClassExtensions 
{
    public static void MyMethod<T>(this T obj, Func<T, bool> condition)
        where T : MyClass
        => obj.MyMethodImpl(x => condition((T)x));
}

"Скрыть" MyMethodImpl из контекстной подсказки можно сделав его приватным, а вызывать тогда его придется через еще один статический метод:

class MyClass
{
    private void MyMethodImpl(Func<MyClass, bool> condition)
    {
        // ...
    }
    public static void MyMethod<T>(T obj, Func<T, bool> condition)
        where T : MyClass
        => obj.MyMethodImpl(x => condition((T)x));
}
static class MyClassExtensions 
{
    public static void MyMethod<T>(this T obj, Func<T, bool> condition)
        where T : MyClass
        => MyClass.MyMethodImpl(obj, condition);
}

Или же, если вы делаете библиотеку, можно обойтись internal.

READ ALSO
Получение guid из .asset файла

Получение guid из .asset файла

Имеется файл с расширениемasset

257
Можно ли запихнуть в ProgressBar.Step значение типа Double?

Можно ли запихнуть в ProgressBar.Step значение типа Double?

Можно ли запихнуть в ProgressBarStep значение типа Double

296
Когда выполнять Dispose контекста?

Когда выполнять Dispose контекста?

Читаю код одного web-приложения (ASPNET MVC)

241
Запрет выделения ячейки в ListView. WPF

Запрет выделения ячейки в ListView. WPF

Есть самый простой ListView в котором 1000+ записейМне нужно использовать это как список Items, чтобы Items не выделялись и при нажатии на стрелки не обводились...

358