Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Net Core. Runtime реализация интерфейса  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Добрый день.

Есть ли из коробки (без thrid-party) возможность что-то вроде такой.
Или почитать норм документацию с примерами, на эту тему:

IA = interface
  int Test(string a);
end;

IA a = VirtualInterface.Create(typeof(IA), SomeMethod) as IA;
var i = a.Test("test");


где SomeMethod - это метод, который будет реализовывать вызовы всех методов интерфейса со всеми аргументами и возможностью присвоения результата.

Интересует аналогия как в Delphi с TVirtualInterface
https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Rtti.TVirtualInterface_(Delphi)

Сообщение было отредактировано: 21 окт 21, 15:29
21 окт 21, 15:26    [22386428]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
Алымов Анатолий
Member

Откуда: Оренбург
Сообщений: 1373
Внедрение зависимостей из коробки.
21 окт 21, 15:34    [22386434]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
petalvik
Member

Откуда:
Сообщений: 738
Мокающие библиотеки наподобие NSubstitute, FakeItEasy, Moq?
21 окт 21, 15:36    [22386435]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Алымов Анатолий
Внедрение зависимостей из коробки.


Конкретного класса реализатора не существует.

petalvik
Мокающие библиотеки наподобие NSubstitute, FakeItEasy, Moq?


thrid-party не подходят...

Вроде как есть System.Reflection.Emit но тогда аналог VirtualInterface придется писать свой.
21 окт 21, 15:52    [22386448]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4388
X-Cite,
Мысль имхо верная, построитель типов с возможностью имплементации интерфейсов в купе с их реализацией.
https://docs.microsoft.com/ru-ru/dotnet/api/system.reflection.emit.typebuilder.addinterfaceimplementation?view=net-5.0
21 окт 21, 16:21    [22386474]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
Алымов Анатолий
Member

Откуда: Оренбург
Сообщений: 1373
X-Cite
Алымов Анатолий
Внедрение зависимостей из коробки.


Конкретного класса реализатора не существует.

Так же решается через внедрение зависимостей - подгружаешь нужную сборку и динамически добавляешь реализацию. Надо только немного допилить класс.
https://siderite.dev/blog/a-net-core-serviceprovider-that-allows.html/#at418103165

Сообщение было отредактировано: 21 окт 21, 16:50
21 окт 21, 16:50    [22386497]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
Алымов Анатолий
Member

Откуда: Оренбург
Сообщений: 1373
X-Cite
Алымов Анатолий
Внедрение зависимостей из коробки.

Конкретного класса реализатора не существует.

Ну и подход этот конечно в топку. Delphi пора похоронить, т.к. он принципам ООП не соответствует и может иметь методы не привязанные к классу. Архитектуру меняйте
21 окт 21, 16:55    [22386502]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Алымов Анатолий,

При чем тут подходы и ООП. Одна из вариаций, не писать 200 методов, когда суть у всех одна.

Вот пример как это можно использовать:

    public interface IA
    {
        void TestA(string a);
        int TestB(char b);
    }

    public class Class
    {
        private void OnInvoke(MethodInfo methodInfo, object?[]? args, ref object? result)
        {
            var content = MakeContent(args);
            var response = _httpclient.Post($"/api/{methodInfo.Name}", content);
            // если необходимо
            //result = response.GetContent
        }

        public void Run()
        {
            var a = VirtualInterface.Create(typeof(IA), OnInvoke) as IA;
            a.TestA("Wow!");
            var x = a.TestB('A');
        }

    }


Будет вызов
/api/TestA
/api/TestB
21 окт 21, 17:11    [22386515]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4388
X-Cite,
ну и зачем эти бритвы, обыкновенная фабрика, заряжаете ее указателями на метод, и по ключу выстреливаете .
те же внедрения зависимости если смотреть верхнею абстракцию, кода 3-8 строчек, меньше чем у вас
21 окт 21, 17:50    [22386544]     Ответить | Цитировать Сообщить модератору
 Re: Net Core. Runtime реализация интерфейса  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
X-Cite
Алымов Анатолий,

При чем тут подходы и ООП. Одна из вариаций, не писать 200 методов, когда суть у всех одна.

Вот пример как это можно использовать:

    public interface IA
    {
        void TestA(string a);
        int TestB(char b);
    }

    public class Class
    {
        private void OnInvoke(MethodInfo methodInfo, object?[]? args, ref object? result)
        {
            var content = MakeContent(args);
            var response = _httpclient.Post($"/api/{methodInfo.Name}", content);
            // если необходимо
            //result = response.GetContent
        }

        public void Run()
        {
            var a = VirtualInterface.Create(typeof(IA), OnInvoke) as IA;
            a.TestA("Wow!");
            var x = a.TestB('A');
        }

    }



Будет вызов
/api/TestA
/api/TestB


Может, конечно, я не понял всей гениальности замысла с этим волшебным VirtualInterface, но обычно такое реализуется просто передачей нужных делегатов в инкапсулирующий класс, который в контракте имеет в т.ч. требуемый интерфейс. Стандартный пример - многочисленные варианты реализации ICommand (RelayCommand, AsyncRelayCommand, итд итп). И если очень надо сделать реализацию на основе какого-то существующего метода, то ничего не мешает встроить его вызов в лямбду с соответствующей сигнатурой:

public class Program
{
  static void Main()
  {
    var a = AFactory.Create();
    a.TestA("abc");
    Console.WriteLine(a.TestB('Q'));
  }
}

static class SomeClass
{
  public static string SomeMethod(string arg0, out int arg1)
  {
    arg1 = arg0?.Length ?? -1;
    return $"{arg0}{arg1}";
  }
}

public interface IA
{
  void TestA(string a);
  int TestB(char b);
}

public class AFactory
{
  public static IA Create()
    => new AImpl(
      s=>SomeClass.SomeMethod(s, out _),
      c=>
      {
        _ = SomeClass.SomeMethod(new string(c, 1), out var n);
        return n;
      }
    );

  class AImpl: IA
  {
    readonly Action<string> _testA;
    readonly Func<char, int> _testB;
    public AImpl(Action<string> testA, Func<char, int> testB)
    {
      _testA = testA;
      _testB = testB;
    }

    public void TestA(string a)
      => (_testA ?? throw new NotImplementedException()).Invoke(a);

    public int TestB(char b)
      => (_testB ?? throw new NotImplementedException()).Invoke(b);
  }
}

(если метод приватный, и его нужно доставать рефлекшеном - Delegate.CreateDelegate или expression trees в помощь).
22 окт 21, 06:49    [22386738]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить