2015-11-10 4 views
1

У меня возникает проблема с отражением на C#. Мне нужно создать общий метод, который динамически создает тип класса с отражением. Я попробовал следующее.Проход динамически печатается в общий шаблон

Type myClass = Type.GetType([email protected]); 
Type myInterfaceClass = myClass.GetInterface([email protected]); 

if (typeof (AnotherInterface).IsAssignableFrom(interfaceClass)) 
{ 
    CreateManager<interfaceClass>(serviceProvider, deviceCapability); 
} 

Мой метод CreateManager выглядит следующим образом:

private void CreateManager<T>(ServiceProvider serviceProvider, DeviceCapability deviceCapability) 
{ 
    T instanceToCreate = CreateClass<T>(serviceProvider, deviceCapability); 
    //Code to instantiate my class 
} 

Проблема заключается в том, что я не могу назвать

CreateManager (ServiceProvider, DeviceCapability);

Как передать интерфейс моему родовому типу? Я искал, и я не мог найти ничего, что я мог бы понять ясно. т.е.

Calling a static method on a generic type parameter

Pass An Instantiated System.Type as a Type Parameter for a Generic Class

+0

Извините, но я не мог понять, в чем проблема, с которой вы столкнулись? Что именно вы подразумеваете под «Я не могу позвонить»? –

+0

Я получаю ошибку "не могу найти символ" interfaceClass " – acostela

+1

http://stackoverflow.com/questions/2107845/generics-in-c-using-type-of-a-variable-as-parameter Я думаю, что ваш вопрос уже существует, но не на 100%, поскольку я не так много в generics. – Thomas

ответ

2

Позволяет сказать CreateManager<T> является метод типа Foo:

public class Foo 
{ 
    private void CreateManager<T>(ServiceProvider serviceProvider, 
            DeviceCapability deviceCapability) 
    { 
    } 
} 

Для того, чтобы динамически вызывать универсальный метод, вам нужно, чтобы получить MethodInfo первый , затем позвоните MakeGenericMethod с фактическим типом, который вы хотите передать (я выбираю string для примера)

var foo = new Foo(); 
var createManagerMethod = foo.GetType() 
          .GetMethod("CreateManager", 
             BindingFlags.Instance | BindingFlags.NonPublic); 

var method = createManagerMethod.MakeGenericMethod(typeof(string)); 
method.Invoke(foo, new object[] { new ServiceProvider(), new DeviceCapability() }); 

Наконец, позвоните Invoke с соответствующим экземпляром объекта и параметрами.

+0

Спасибо за ваш ответ. Но я получаю ту же ошибку «Не могу найти символ», когда я использую свой «объект типа». Я думаю, проблема в том, что таким образом, типы разрешаются в compilertime, и типы отражений разрешаются во время выполнения. Может быть, это? – acostela

+1

Хорошо, это сработало отлично! Я изменил тип stringof с экземпляром dinamyc моего типа и работал «MakeGenericMethod (новый тип []] {interfaceClass}) « – acostela

0

Я не вижу, почему вам нужно отражение для этого. Вы можете сделать это, как показано ниже:

public interface IYourInterface //Give it a good name 
{ 
    void Instantiate(ServiceProvider serviceProvider, DeviceCapability deviceCapability); 
} 

public class YourClass : IYourInterface 
{ 
    public YourClass() 
    { 
     // do something if you want 
    } 

    public void Instantiate (ServiceProvider serviceProvider, DeviceCapability deviceCapability) 
    { 
     // what ever needs to be done here 
    } 
} 

private void CreateManager<T>(ServiceProvider serviceProvider, DeviceCapability deviceCapability) 
    where T : IYourInterface, new() 
{ 
    var instance = new T(); 
    instance.Instantiate(serviceProvider, deviceCapability); 
} 

/* 
    Usage 
*/ 

    CreateManager<YourClass>(serviceProvider, deviceCapability); 
+1

Мне нужно отражение, потому что я читал классы динамически из файла параметров, после чего я должен добавить их в serviceProvider во время выполнения, то есть serviceProvider.Add (objectInstantiated); – acostela

+0

Хорошо, в таком случае вы не можете этого сделать. ; o) – DHN

+0

Я, наконец, сделал это. Вы можете проверить ответ. Спасибо за ваш ответ;) – acostela