Создайте метод, который соответствует отраженному типу - PullRequest
2 голосов
/ 21 декабря 2011

Я использую сторонний .net dll, которому я звоню. Я упрощаю свой код, но это примерно так.

// The assembly has already been loaded into 'ass'

Type params = ass.GetType("RemoteCalls.ParametersDelegate");
Delegate UseDel = Delegate.CreateDelegate(params, this, "MyGetParams");

Затем я могу передать этот делегат (UseDel) в отраженный объект, и он при необходимости вызовет MyGetParams.

Проблема, с которой я сталкиваюсь, состоит в том, что сигнатура метода состоит из типа внутри сторонней библиотеки dll.

Подпись ParadeDelegate ...

Parameters GetPars();

Итак, мой метод не может вернуть правильный тип (параметры). Я пробовал следующее ..

private static class OtherDelegates<T>
{
    public static T MyGetParams()
    {
        //... code to build up the 'Parameters' class, and return it.
    }
}

Тогда звоню ..

Delegate UseDel = Delegate.CreateDelegate(params, this, "OtherDelegates<xxx>.MyGetParams");

Но я не могу понять, что добавить в «ххх».

Я думаю, что я мог бы сделать это, используя CodeDomProvider , но задавался вопросом, есть ли более простой способ?

Кроме того, из-за проблем с лицензированием невозможно добавить DLL в качестве справки.

Спасибо Рич.

1 Ответ

2 голосов
/ 25 января 2012

Я бы полностью инкапсулировал стороннюю dll за библиотекой dll, которой вы управляете, используя none сторонних типов на интерфейсе. Это означает, что вы можете ссылаться на свою (уже собранную) библиотеку dll изолированно. Очевидно, что вам все еще нужно кодировать в sch способ, который завершается неудачно, когда сторонний dll недоступен.

Это также имеет дополнительные преимущества:

  • вы можете смоделировать реализацию для тестирования
  • Вы можете предоставить запасную стратегию, если сторонний dll не существует
  • потенциально вы можете поддерживать несколько провайдеров

Я очень успешно использовал вышеизложенное, например, оборачивая MapPoint (гео-маршрутизацию) с большим запасным отступлением.

Плюс - вам не нужно возиться с отражением!

...