5

私は、このようなシングルトン クラスの側に実装されているジェネリック デリゲートを持っています。

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>();
}

なぜこのようなエラーが発生するのかわかりませんでした。助けていただければ幸いです。

4

1 に答える 1

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();
于 2013-09-30T10:57:32.853 に答える