Delegate.CreateDelegate导致ArgumentException

时间:2011-08-30 11:05:55

标签: c# wpf casting delegates event-handling

在我在主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解决,但没有运气,所以我写这里是为了向社区提供帮助。 如果你有建议,他们将非常感激。 如果问题不明确,请向我询问更多信息。 在此先感谢您的回复。 尼诺

0 个答案:

没有答案