Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时从动态加载的dll创建对象列表_C#_Oop_Dynamic_Dll - Fatal编程技术网

C# 在运行时从动态加载的dll创建对象列表

C# 在运行时从动态加载的dll创建对象列表,c#,oop,dynamic,dll,C#,Oop,Dynamic,Dll,我有一个在运行时加载的dll。我试图在运行时从动态加载的dll中创建每种类型的实例,并将这些实例添加到列表中。dll中的所有类都基于AYClass,因此它们应该成功地添加到列表中。但是我犯了如下这样的错误 Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException' in Microsoft.CSharp.dll Additional information: An unex

我有一个在运行时加载的dll。我试图在运行时从动态加载的dll中创建每种类型的实例,并将这些实例添加到列表中。dll中的所有类都基于AYClass,因此它们应该成功地添加到列表中。但是我犯了如下这样的错误

Exception thrown: 
'Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException' in Microsoft.CSharp.dll

Additional information: An unexpected exception occurred while binding a dynamic operation
我的代码如下

Assembly assembly = Assembly.LoadFrom(@"D:\Library\CurrencyData.dll");
List<AYClass> listObjects = new List<AYClass>();
foreach (Type type in assembly.GetExportedTypes())
{
    if (type.BaseType.ToString().Contains("AYClass"))
    {
        dynamic c = Activator.CreateInstance(type);
        listObjects.Add(c); // ******* Exception is thrown here
    }
}
Assembly=Assembly.LoadFrom(@“D:\Library\CurrencyData.dll”);
List listObjects=新列表();
foreach(在assembly.GetExportedTypes()中键入类型)
{
if(type.BaseType.ToString()包含(“AYClass”))
{
动态c=Activator.CreateInstance(类型);
listObjects.Add(c);//*******异常在此处引发
}
}

我应该怎么做才能解决这个问题?

当您知道基本类型时,为什么要使用
动态
?不要那样做。改用var:

Assembly assembly = Assembly.LoadFrom(@"D:\Library\CurrencyData.dll");
List<AYClass> listObjects = new List<AYClass>();
foreach (Type type in assembly.GetExportedTypes())
{
    if (type.BaseType.ToString().Contains("AYClass"))
    {
        var c = (AYClass)Activator.CreateInstance(type);
        listObjects.Add(c);
    }
}
Assembly=Assembly.LoadFrom(@“D:\Library\CurrencyData.dll”);
List listObjects=新列表();
foreach(在assembly.GetExportedTypes()中键入类型)
{
if(type.BaseType.ToString()包含(“AYClass”))
{
var c=(AYClass)Activator.CreateInstance(类型);
添加(c);
}
}
一般来说,C#是一种类型安全的语言,因此使用
动态
应该是例外。还要确保,在动态加载的dll和“加载程序”中,它们使用完全相同的基类。在任何其他情况下,转换实例都将失败


此外,您可以使用比较类型而不是其名称来替换此行:
if(type.BaseType.ToString().Contains(“AYClass”)
。这不是很安全,因为具有相同名称的类可以在同一程序集中的不同程序集和/或命名空间中声明。

hi,如果使用“var”,则不能使用listObjects.add(c)。必须将对象类型强制转换为AYClass@ayilmaz您可以使用
AYClass c=(AYClass)Activator.CreateInstance(类型)变量只是一个隐藏类型的简写<代码>var
仍然有效。@BendEg,它给了我这个错误,无法将类型为“AY.CurrencyData.Model.Currency”的对象强制转换为类型为“AY.CurrencyData.Model.AYClass”。是的,您的问题是没有相同的基类。它们在不同的程序集中声明吗?是的,它们在不同的程序集中声明