我试图传递一个动态加载的dll的类型(它使用一个接口,但我需要 conectrete这个实现到一个函数,我错过了一些东西。
var data = LoadAssemblyFromParamenter(pathToDataDll);
Type dataType = data.GetType().MakeGenericType(data.GetType());
SomeTest<dataType>();
public void SomeTest<T>()
{
//do something with T
}
错误是“找不到类型或命名空间'dataType'coulnd ...”
具体类型适用于FileHelpers对象(使用字段),因此我需要具体的实现。
P.S。这必须是.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);
}
}
答案 0 :(得分:2)
使用Method语法不能这样做,因为为此你可以在编译时知道类型。但是,您可以使用反射来调用您的方法。
此代码可以帮助您开始:
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);
}
使用object,它类似,但你必须使用反射动态构造对象。
答案 1 :(得分:1)
使用“动态”关键字:
public void Doit() {
dynamic data=LoadAssemblyFromParamenter(pathToDataDll);
SomeTest(data);
}
public void SomeTest<T>(T arg) {
Debug.WriteLine("typeof(T) is "+typeof(T));
}
!!!编辑!!!:抱歉,我错过了你需要3.5 Framework。如果是这样,请使用:
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));
}