簡體   English   中英

使用在 C# 中的通用 class 中定義的通用 arguments 調用通用方法

[英]Invoke a generic method with generic arguments defined in a generic class in C#

這是我的代碼:

  class Program1
    {
        private static void Main(string[] args)
        {
            //MyClass myClass = new MyClass();
            //GetIdRequest getIdRequest = new GetIdRequest();
            //GetIdReponse getIdReponse= myClass.DoRequest(getIdRequest);
            //Console.WriteLine($"getIdReponse.Msg:" + getIdReponse.Msg + ",getIdReponse.Data:" + getIdReponse.Data);

            Type myClassType = typeof(MyClass);
            Object myClassTypeInstance = System.Activator.CreateInstance(myClassType);
            Type unboundGenericType = typeof(MyRequest<>);
            Type boundGenericType = unboundGenericType.MakeGenericType(typeof(GetIdRequest));

            Type getIdRequestType = typeof(GetIdRequest);
            Object getIdRequest = System.Activator.CreateInstance(getIdRequestType);


            MethodInfo methodInfo = myClassType.GetMethod("DoRequest", BindingFlags.Public| BindingFlags.Instance, null, new Type[] { boundGenericType }, null);


            object res = methodInfo.Invoke(myClassTypeInstance, new object[] { getIdRequest });

            Console.ReadKey();
        }

    }
    public class MyClass
    {
        public T DoRequest<T>(MyRequest<T> obj) where T : MyReponse
        {
            T res = Activator.CreateInstance<T>();
            return res;
        }
    }

    public class GetIdRequest: MyRequest<GetIdReponse>
    {
    }

    public class GetIdReponse: MyReponse
    {
        public string Data { set; get; } = "data";
    }

    public interface MyRequest<T> where T: MyReponse
    {

    }

    public class MyReponse
    {
        public string Msg { set; get; } = "res";
    }

我想用運行時在通用 class 中定義的通用 arguments 調用通用方法,但我得到了異常

“System.ArgumentException:““ TestPlatformApi.MyRequest `Genericarguments [0] on 1 [t] ““ TestPlatformApi.GetIdRequest '違反類型't'的約束”

  1. 正如 Charlieface 評論的那樣,您應該刪除對 MyRequest 的約束。
  2. 從您的代碼中,我無法充分了解您的設計。 所以,我只是在假設下展示一些代碼。
 public class MyClass<T> where T : MsgConstraint
    {
        private IList<T> middlewares = new List<T>();

        public void Register(T m)
        {
            middlewares.Add(m);
        }

        public T DoRequest(Type type)
        {
            return middlewares.Where(st => st.GetType() == type).FirstOrDefault();
        }
    }

    public interface MsgConstraint
    {
        public string Msg { set; get; }
    }

    public class HttpMsg : MsgConstraint
    {
        public string Msg { get; set; } = "HTTPMSG";
    }

    public class RpcMsg : MsgConstraint
    {
        public string Msg { get; set; } = "RPCMSG";
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass<MsgConstraint> myClass = new MyClass<MsgConstraint>();
            myClass.Register(new HttpMsg());
            myClass.Register(new RpcMsg());
            MsgConstraint http = myClass.DoRequest(typeof(HttpMsg));
            Console.WriteLine(http.Msg);
            MsgConstraint rpc = myClass.DoRequest(typeof(RpcMsg));
            Console.WriteLine(rpc.Msg);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM