0

下面我有一些方法可以帮助我执行有参数和无参数的操作,并且它有效。但是我有一个我想摆脱的问题,问题是当我打电话时

Execute<Action<Myclass>, Myclass>(ActionWithParameter); 

我通过了MyClass2次。第一次定义我的 Action 所需的参数ActionWithParameter,第二次定义我在Execute<TAction, TType>方法中期望的参数类型。

所以我的问题是:有没有办法摆脱 2nd GenericTType并以某种方式从第一个 generic 中获取它TAction

也许像TAction<TType>什么?

class Program
    {
        static void Main(string[] args)
        {
            Execute<Action>(ActionWithoutParameter);
            Execute<Action<Myclass>, Myclass>(ActionWithParameter);

            Console.ReadLine();
        }

        private static void ActionWithoutParameter()
        {
            Console.WriteLine("executed no parameter");
        }

        private static void ActionWithParameter(Myclass number)
        {
            Console.WriteLine("executed no parameter   " + number.ID);
        }

        private static void Execute<TAction>(TAction OnSuccess)
        {
            Execute<TAction, Myclass>(OnSuccess);
        }
        private static void Execute<TAction, TType>(TAction OnSuccess)
        {
            if (OnSuccess is Action)
            {
                Action method = OnSuccess as Action;
                method();
            }
            else if (OnSuccess is Action<TType>)
            {
                Myclass myclass = new Myclass() { ID = 123 };
                TType result = (TType)(object)myclass;
                Action<TType> method = OnSuccess as Action<TType>;
                method(result);
            }
        }
4

1 回答 1

0

也许使用该方法的非泛型和泛型版本可以解决问题:

    public static void Execute<TType>(Action<TType> OnSuccess) 
         where TType : Myclass // gets rid of unnecessary type-casts - or you just use Action<Myclass> directly - without the generic parameter...
    { 
         // throw an exception or just do nothing - it's up to you...
         if (OnSuccess == null)
             throw new ArgumentNullException("OnSuccess"); // return;

         TType result = new Myclass() { ID = 123 };
         OnSuccess(result);
    }

    public static void Execute(Action OnSuccess) 
    { 
        if (OnSuccess == null)
            throw new ArgumentNullException(); // return;

        OnSuccess();            
    }

(但是我不太确定结果生成 + 动作执行的目的 - 仅使用非通用Execute(Action)版本也可以做到这一点......)

于 2013-07-03T22:03:28.677 回答