c#generic Delegate Error无法绑定到目标方法,因为它的签名

时间:2013-09-30 09:32:06

标签: c# generics delegates

我有一个泛型委托,它在像这样的单例类中实现;

public class BBCacheMethods
{
    private static BBCacheMethods instance;

    private BBCacheMethods() { }

    public static BBCacheMethods Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new BBCacheMethods();
            }

            return instance;
        }
    }

    public T GetResUstPolitikaBelgeTurlerisForCache<T>() where T:class
    {
        return null;
    }

    public delegate T MethodToInvokeDelegate<T>();
    public static MethodToInvokeDelegate<T> MethodToInvoke<T>() where T : class
    {  
        MethodInfo method = Instance
            .GetType()
            .GetMethod("GetResUstPolitikaBelgeTurlerisForCache");

        if (null != method)
        {
            return (MethodToInvokeDelegate<T>)Delegate.CreateDelegate(
                typeof(MethodToInvokeDelegate<T>),
                Instance,
                method);
        }
        else
            throw new FaultException("");
    }

当我调用委托时,我收到此错误:

  

无法绑定到目标方法,因为其签名或安全透明度与委托类型的方法不兼容。

调用委托的类以这种方式调用它:

public static void loadCache<T>() where T : class
{
    var aa = BBCacheMethods.MethodToInvoke<T>();
}

我没有找到为什么会收到这样的错误,感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我不认为你想要的实际上是可能的。委托规范中使用的泛型参数T必须与方法GetResUstPolitikaBelgeTurlerisForCache和MethodToInvoke中的T相同,但框架不能假设这一点。

我得到了一些使用通用单例类的东西:

public class BBCacheMethods<T> where T:class
{
    private static BBCacheMethods<T> instance;

    private BBCacheMethods() { }

    public static BBCacheMethods<T> Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new BBCacheMethods<T>();
            }
            return instance;
        }
    }


    public T GetResUstPolitikaBelgeTurlerisForCache()
    {
        return null;
    }


    public delegate T MethodToInvokeDelegate();

    public static MethodToInvokeDelegate MethodToInvoke()
    {

        MethodInfo method = Instance.GetType().GetMethod("GetResUstPolitikaBelgeTurlerisForCache");
        if (null != method)
        {
            return (MethodToInvokeDelegate)Delegate.CreateDelegate(typeof(MethodToInvokeDelegate), Instance, method);
        }
        else
            throw new FaultException("");
    }

然后您可以按如下方式调用它:

var aa = BBCacheMethods<T>.MethodToInvoke();
var result = aa();