我在从外部程序集中转换带有抽象类的ViewModel类时遇到了问题。
我有两个dll和一个可执行文件:
动态链接库Cockpit.RUN.Common.dll中的一个抽象类,这个动态链接库被引用:在动态链接库Cockpit.RUN.ViewModels的另一个工程和可执行文件Cockpit.RUN.Test所在的工程中,但在可执行文件所在的工程中不引用Cocpit.RUN.ViewModels,因为它是动态加载的
abstrac类:(dll)
using Caliburn.Micro;
namespace Cockpit.RUN.Common
{
public abstract class PluginModel : PropertyChangedBase
{
public abstract double Width { get; set; }
public abstract double Height { get; set; }
public abstract double Left { get; set; }
public abstract double Top { get; set; }
private double zoomfactorfrompluginmodel;
public double ZoomFactorFromPluginModel
{
get => zoomfactorfrompluginmodel;
set
{
zoomfactorfrompluginmodel = value;
NotifyOfPropertyChange(() => ZoomFactorFromPluginModel);
}
}
public string NameUC;
}
}第二个动态链接库包含视图模型,我在这个动态链接库中有很多不同的插件: Push_ViewModel Cockpit.RUN.ViewModels.dll Switch_ViewModel...
例如,我使用Push_ViewModel的抽象类派生每个类:
using Cockpit.RUN.Common;
using System.Windows;
using System.Windows.Input;
namespace Cockpit.RUN.ViewModels
{
public class PushButton_ViewModel : PluginModel
{
public PushButton_ViewModel(params object[] settings)
{
NameUC = (string)settings[2];
Layout = new LayoutPropertyViewModel();
}
public override double Left
{
get => Layout.UCLeft;
set => Layout.UCLeft = value;
}
public override double Top
{
get => Layout.UCTop;
set => Layout.UCTop = value;
}
public override double Width
{
get => Layout.Width;
set => Layout.Width = value;
}
public override double Height
{
get => Layout.Height;
set => Layout.Height = value;
}
}
}还有一件事,这个插件dll是在引导过程中动态加载的
protected override IEnumerable<Assembly> SelectAssemblies()
{
var assemblies = new List<Assembly>();
assemblies.AddRange(base.SelectAssemblies());
assemblies.Add(Assembly.LoadFile(@"J:\ProjetC#\Cockpit-master\Cockpit.RUN.Test\bin\Debug\Cockpit.RUN.ViewModels.dll"));
assemblies.Add(Assembly.LoadFile(@"J:\ProjetC#\Cockpit-master\Cockpit.RUN.Test\bin\Debug\Cockpit.RUN.Views.dll"));
return assemblies;
} 所以问题是,当我想用抽象基PulginModel强制转换每个ViewModels时,我的结果是空的:
using Cockpit.RUN.Common;
:
:
public BindableCollection<PluginModel> MyCockpitPlugins { get; set; }
:
:
model = "Cockpit.RUN.ViewModels.PushButton_ViewModel, Cockpit.RUN.ViewModels";
var typeClass = Type.GetType(model); // its ok
var viewmodel = resolutionRoot.TryGet(typeClass, param); // Its ok i have an instance of PushButton_ViewModel
var v = viewmodel as PluginModel; //-> not ok its null
var w = (PluginModel)viewmodel; //-> not ok its error
// So i cant display my list of views associated
MyCockpitPlugins.Add(v);我是不是做错了什么?
转换前在中断调试时加载的程序集:

以及typeof和GetType的结果:
typeof(PluginModel) gives {Name = "PluginModel" FullName = "Cockpit.RUN.Common.PluginModel"}
viewmodel.GetType().BaseType gives {Name = "PluginModel" FullName = "Cockpit.RUN.ViewModels.PluginModel"}发布于 2019-08-25 22:50:02
接口(dll):
public interface IPlugin
{
ICallbacks Callbacks { get; set; }
string NameUC { get; set; }
double Width { get; set; }
double Height { get; set; }
double Left { get; set; }
double Top { get; set; }
double ZoomFactorFromPluginModel { get; set; }
}
public interface ICallbacks
{
void SomeCallback();
}您的实现:
public class PushButton_ViewModel : PluginModel, IPlugin
{
// How was this going to work? Who makes the instance?
//public PushButton_ViewModel(params object[] settings)
//{
// NameUC = (string)settings[2];
// Layout = new LayoutPropertyViewModel();
//}
public ICallbacks Callbacks { get; set; }
public override double Left
{
get => Layout.UCLeft;
set => Layout.UCLeft = value;
}
public override double Top
{
get => Layout.UCTop;
set => Layout.UCTop = value;
}
public override double Width
{
get => Layout.Width;
set => Layout.Width = value;
}
public override double Height
{
get => Layout.Height;
set => Layout.Height = value;
}
}然后初始化它
Type t = Type.GetType("PushButton_ViewModel");
object obj = FormatterServices.GetUninitializedObject(t);
IPlugin instance = obj as IPlugin;
instance.NameUC = "the name";
instance.Callbacks = new CallbacksModel();https://stackoverflow.com/questions/57646030
复制相似问题