Приведение к типу - PullRequest
       22

Приведение к типу

0 голосов
/ 20 апреля 2009

Мне интересно, возможно ли привести объект к типу ... Я только начал использовать Reflection, поэтому, возможно, я делаю все неправильно, но вот что я хотел бы сделать:

...
Type type = ...;
Type interfaceType = someOtherType.GetInterface("IConverter`2");

return (Cast to interfaceType)Activator.CreateInstance(type);

Возможно ли приведение к интерфейсу?

Обновление:

Компилятор говорит, что T и K не могут быть найдены. Экземпляр myInterface Type знает классы T и K ...

public IConverter<T, K> GetConverter(Type type)
{
    if (dtoModelDictionary.ContainsKey(type))
    {
        Type foundType = dtoModelDictionary[type];
        Type myInterface = foundType.GetInterface("IConverter`2");

        return (IConverter<T, K>)Activator.CreateInstance(foundType); 
    }
    else if (dalModelDictionary.ContainsKey(type))
    {
        Type foundType = dalModelDictionary[type];

        return (IConverter<T, K>)Activator.CreateInstance(foundType);
    }
    else
    {
        throw new System.Exception();
    }
}

Второе обновление:

public SomeClass GetConverter(Type type)
    {
        if (dtoModelDictionary.ContainsKey(type))
        {
            Type foundType = dtoModelDictionary[type];
            Type myInterface = foundType.GetInterface("IConverter`2");

            IConverter<T, K> converter = (IConverter<T, K>)Activator.CreateInstance(foundType); 
            return converter.someMethod(); 
        }
    }

Ответы [ 4 ]

3 голосов
/ 20 апреля 2009

Ответ на ваше обновление:

Нельзя привести тип к типу, в котором общие аргументы не определены. T и K должны быть определены для метода, который его использует.

Либо объявите это:

public IConverter<T, K> GetConverter<T, K>(Type type)

Или, если вы часто сталкиваетесь с проблемой использования этого интерфейса, но не знаете типов T или K, используйте интерфейс без обобщенных символов:

interface IConverter
{ 
  // general members
}

interface  IConverter<T, K> : IConverter 
{
  // typesave members
}

public IConverter GetConverter(Type type)
{
  // ...
  return (IConverter)Activator.CreateInstance(type);
}
1 голос
/ 20 апреля 2009

Вы можете сделать это:

var type = typeof(IConverter<,>).MakeGenericType(new Type[] { typeof(T), typeof(K) });
1 голос
/ 20 апреля 2009

Вы можете привести объект только к тому, чем он является на самом деле. Например, вы можете привести String ссылку на IEnumerable, но вы не можете привести ее к char[].

Если то, что возвращает ваш метод, на самом деле реализует интерфейс, вы можете просто привести его как обычно.

Пример:

return (IConverter<int,string>)Activator.CreateInstance(type);

Edit:
Вам нужно сделать метод универсальным, чтобы вы могли указывать типы данных при его вызове:

public IConverter<T, K> GetConverter<T, K>(Type type) {
   ...
}
1 голос
/ 20 апреля 2009

Не совсем, нет ... по крайней мере, не таким образом. Проблема в том, что ваше возвращаемое значение должно быть таким, каким будет набрано возвращаемое значение вашего метода. Поскольку все должно быть набрано во время компиляции, я могу видеть ограниченный или не реальный вариант использования этого конкретного типа приведения типов - может быть, вы можете рассказать еще немного о том, что вы пытаетесь достичь?

Теперь, если вы используете дженерики, у вас do есть история печатания во время выполнения, вы можете вернуть тип параметра Type:

public T MyMethod<T>(...)
...
return (T)Activator.CreateInstance(type);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...