Передача динамически загружаемого типа в SomeFunction <T> - PullRequest
3 голосов
/ 26 сентября 2011

Я пытаюсь передать тип динамически загружаемой dll (она использует интерфейс, но мне нужна конкретная реализация этого) в функцию, и мне что-то не хватает.

var data = LoadAssemblyFromParamenter(pathToDataDll);
Type dataType = data.GetType().MakeGenericType(data.GetType());
SomeTest<dataType>();

public void SomeTest<T>() 
{
    //do something with T 
}

Ошибка: «Тип данных или пространство имен 'dataType' coulnd not found ..."

Конкретный тип предназначен для объекта FileHelpers (который использует поля), поэтому мне нужноконкретное воплощение.

ps Это должно быть .net 3.5 ....

Для разработки SomeMethod<T>( IEnumerable<T> items ) звонки

public static void WriteRecords<T>(IEnumerable<T> records, string fileName )
    where T: ICMSDataDictionary
{
    if (records == null || String.IsNullOrEmpty(fileName))
        return;

    if (records.Any())
    {
        FileHelpers.DelimitedFileEngine<T> engine =
            new FileHelpers.DelimitedFileEngine<T>();
        engine.WriteFile(fileName, records);
    }
}

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Вы не можете сделать это, используя синтаксис метода, потому что для этого вы будете знать тип во время компиляции. Однако вы можете вызвать свой метод с помощью отражения.

Этот код должен помочь вам начать:

    static void Main(string[] args)
    {
        //Get method Method[T]
        var method = typeof(Program).GetMethod("Method", BindingFlags.NonPublic | BindingFlags.Static);
        //Create generic method with given type (here - int, but you could use any time that you would have at runtime, not only at compile time)
        var genericMethod = method.MakeGenericMethod(typeof(int));
        //Invoke the method
        genericMethod.Invoke(null, null);
    }

    static void Method<T>()
    {
        Console.WriteLine(typeof(T).Name);
    }

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

1 голос
/ 26 сентября 2011

Используйте ключевое слово "dynamic":

public void Doit() {
  dynamic data=LoadAssemblyFromParamenter(pathToDataDll);
  SomeTest(data);
}

public void SomeTest<T>(T arg) {
  Debug.WriteLine("typeof(T) is "+typeof(T));
}

!!! РЕДАКТИРОВАТЬ !!!Если это так, используйте это:

public void Doit() {
  var data=LoadAssemblyFromParamenter(pathToDataDll);
  var mi=this.GetType().GetMethod("SomeTest").MakeGenericMethod(data.GetType());
  mi.Invoke(this, new object[0]);
}

public void SomeTest<T>() {
  Debug.WriteLine("typeof(T) is "+typeof(T));
}
...