powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Net Core. Runtime реализация интерфейса
10 сообщений из 10, страница 1 из 1
Net Core. Runtime реализация интерфейса
    #40105867
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

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

Код: c#
1.
2.
3.
4.
5.
6.
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)
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105870
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внедрение зависимостей из коробки.
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105871
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мокающие библиотеки наподобие NSubstitute, FakeItEasy, Moq?
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105883
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алымов Анатолий
Внедрение зависимостей из коробки.


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

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


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

Вроде как есть System.Reflection.Emit но тогда аналог VirtualInterface придется писать свой.
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105904
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,
Мысль имхо верная, построитель типов с возможностью имплементации интерфейсов в купе с их реализацией.
https://docs.microsoft.com/ru-ru/dotnet/api/system.reflection.emit.typebuilder.addinterfaceimplementation?view=net-5.0
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105926
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Алымов Анатолий
Внедрение зависимостей из коробки.


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

Так же решается через внедрение зависимостей - подгружаешь нужную сборку и динамически добавляешь реализацию. Надо только немного допилить класс.
https://siderite.dev/blog/a-net-core-serviceprovider-that-allows.html/#at418103165
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105930
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Алымов Анатолий
Внедрение зависимостей из коробки.

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

Ну и подход этот конечно в топку. Delphi пора похоронить, т.к. он принципам ООП не соответствует и может иметь методы не привязанные к классу. Архитектуру меняйте
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105936
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алымов Анатолий,

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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    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
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40105957
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,
ну и зачем эти бритвы, обыкновенная фабрика, заряжаете ее указателями на метод, и по ключу выстреливаете .
те же внедрения зависимости если смотреть верхнею абстракцию, кода 3-8 строчек, меньше чем у вас
...
Рейтинг: 0 / 0
Net Core. Runtime реализация интерфейса
    #40106079
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Алымов Анатолий,

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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    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, итд итп). И если очень надо сделать реализацию на основе какого-то существующего метода, то ничего не мешает встроить его вызов в лямбду с соответствующей сигнатурой:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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 в помощь).
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Net Core. Runtime реализация интерфейса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]