在我在主WPF应用程序中使用的第三方程序集之前,我必须使用第三方程序集中包含的一些函数(通过DevExpress)。我尝试通过Reflection和外部别名来使用它,以避免在两个程序集之间具有相同名称的类,事件(等等)之间发生冲突。
由于我在使用这些解决方案时遇到了问题,最后我决定在我的主项目外部创建一个包装器,在其引用中包含“旧”程序集,并通过声明我需要继承自程序集类的类。
这个解决方案似乎运行正常,但我遇到了一个关于事件处理的大问题。 我必须处理两个程序集中定义的事件,所以我尝试按照我之前描述的方式进行操作。
在我的包装应用程序中,我有:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DevExpress.Xpf.Printing;
namespace WrapperSimpleLink101
{
//declaration of my event
public delegate void EventHandlerNew<ClassEvento>(object obj, ClassEvento ClEv);
//declaration of a working class
public class Class1 : DevExpress.Xpf.Printing.SimpleLink
{
public ColumnDirection vDirezione;
public Class1(ColumnDirection direzione)
{
vDirezione = direzione;
}
public ColumnDirection direzione
{
get { return vDirezione; }
set { vDirezione = value; }
}
//event raising DelegateCasting
public void SetCreateDetail(EventHandlerNew<ClassEvento> pD)
{
this.CreateDetail += DelegateUtility.Cast<EventHandler<CreateAreaEventArgs>>(pD);
}
}
//my event
public class ClassEvento : DevExpress.Xpf.Printing.CreateAreaEventArgs
{
public ClassEvento(int detailindex): base(detailindex)
{
this.detailIndex = detailindex;
}
public int detailIndex { get; set; }
}
//utility to cast eventhandlernew<ClassEvento> to EventHandler<CreateAreaEventArgs>
public static class DelegateUtility
{
public static T Cast<T>(Delegate source) where T : class
{
return Cast(source, typeof(T)) as T;
}
public static Delegate Cast(Delegate source, Type type)
{
if (source == null)
return null;
Delegate[] delegates = source.GetInvocationList();
if (delegates.Length == 1)
// the line where it's raised error ArgumentException: Error binding to target method
**return Delegate.CreateDelegate(type, delegates[0].Target, delegates[0].Method);**
Delegate[] delegatesDest = new Delegate[delegates.Length];
for (int nDelegate = 0; nDelegate < delegates.Length; nDelegate++)
delegatesDest[nDelegate] = Delegate.CreateDelegate(type,
delegates[nDelegate].Target, delegates[nDelegate].Method);
return Delegate.Combine(delegatesDest);
}
}
}
在主WPF应用程序中:
using WrapperSimpleLink101;
[...]
Class1 slink = new Class1(ColumnDirection.AcrossThenDown);
[...]
//invocation of eventhandlernew
slink.SetCreateDetail(new EventHandlerNew<ClassEvento>(slink_CreateDetail));
[...]
public void slink_CreateDetail(object sender, ClassEvento e)
{
e.Data = this.scoreCards[e.DetailIndex];
}
我必须使用转换委托来处理这个事件,因为我无法直接(在主应用程序中)传递给slink.CreateDetail我的ClassEvento(而不是CreateAreaEventArgs),即使ClassEvento继承自CreateAreaEventArgs(我也可以争辩原因),但我之前显示的错误。
进行更深入的调试我注意到传递给我的外部包装器的EventHandler在System.InvalidOperationException类型中引发了一个异常,“只能在Type.IsGenericParameter为true的Type上调用Method”,但我不确定主错误与此错误相关。
我试图通过自己和MSDN / Internet解决,但没有运气,所以我写这里是为了向社区提供帮助。 如果你有建议,他们将非常感激。 如果问题不明确,请向我询问更多信息。 在此先感谢您的回复。 尼诺