从未知类调用方法

时间:2016-09-28 09:03:29

标签: c# generics

可以从一个未知的类中调用一个方法吗?

public class ClientSampleResponse : IPacket
{
    public string Name { get; set; }
    public string Lastname { get; set; }
    public string Address { get; set; }
    public void Execute<T>(T client)
    {
        var method = typeof(T).GetMethod("Send");
        //method.Invoke(this);
    }
}

我正在尝试使用上面的代码从未知类调用此方法:

public void Send<T>(T packet) where T : IPacket
{
    // Skip contents
}

3 个答案:

答案 0 :(得分:2)

这应该有效:

public void Execute<T>(T client)
{
    var method = typeof(T).GetMethod("Send");
    method.Invoke(client, new object[] { this });
}

另外,请确保您的对象客户端不具备多种发送方法,否则您应该考虑使用GetMethod("Send", new Type[] { typeof(IPacket) })
Documentation: GetMethod(string name, Type[] types)

答案 1 :(得分:2)

只要方法以解释here存在,您就可以调用任何对象的任何方法。

我发现代码示例非常清楚:

   // Get the constructor and create an instance of MagicClass

        Type magicType = Type.GetType("MagicClass");
        ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
        object magicClassObject = magicConstructor.Invoke(new object[]{});

        // Get the ItsMagic method and invoke with a parameter value of 100

        MethodInfo magicMethod = magicType.GetMethod("ItsMagic");
        object magicValue = magicMethod.Invoke(magicClassObject, new object[]{100});

我错过了什么吗?

答案 2 :(得分:1)

你需要调用Invoke(client,this)而不是Invoke(this),因为这是ClientSampleResponse,IPacket与T无关。

public class ClientSampleResponse : IPacket
{
   public string Name { get; set; }
   public string Lastname { get; set; }
   public string Address { get; set; }
   public void Execute<T>(T client)
   {
       var method = typeof(T).GetMethod("Send");
       method.Invoke(client, new object[] { this });
   }

}

是的,参数以数组形式发送