Использование методов расширения со сборками времени выполнения - PullRequest
2 голосов
/ 17 сентября 2010

Есть ли способ использовать методы расширения в классе, который был динамически создан с использованием Relection.Emit?Например:

 class somewhere
 {
     somewhere()
     {
         // define the type here using ReflectionEmit, etc.
         Type tableType = CreateTableType(...table parameters...);

         var table = Activator.CreateInstance(tableType);
         table.Shuffle();
     } 
 }

 //... elsewhere
 public class static TableTypeExtensions   
 {
      public static Table Shuffle( this Table t)  
      {   
          ...
      }
 }

Но у меня нет класса по имени "Table", доступен только тип tableType.
Есть ли способ обойти это?
Спасибо

Ответы [ 4 ]

4 голосов
/ 17 сентября 2010

Сделайте так, чтобы динамический класс реализовывал интерфейс (пустой, если хотите), добавьте расширения к интерфейсу.

3 голосов
/ 17 сентября 2010

Давайте посмотрим на то, что вы спрашиваете.

Вы спрашиваете, как заставить метод расширения работать с экземпляром вашего объекта.

Очевидно, что для этого нужнобыть Table, в противном случае ваш вопрос не имеет смысла.

Так что просто приведите его к Table:

var table = (Table)Activator.CreateInstance(tableType);

, и вы сможете просто вызвать метод расширения.

3 голосов
/ 17 сентября 2010

Определите общий базовый класс для вашего TableType и определите метод расширения для него.Таким образом, ваш метод расширения должен быть доступен и для производных классов.

0 голосов
/ 17 сентября 2010

В вашем коде somewhere есть ссылка на тип Table? Если это так, вы можете:

 Type tableType = CreateTableType(...table parameters...);

 var table = Activator.CreateInstance(tableType) as Table;
 table.Shuffle();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...