C# 但我担心,如果你想做这样的事情,你最终还是要“自己做”,因为语言对于这类问题只有一种方法:反射…抱歉:(+1用于更新。关于“注释“我想要的是行为类似于动态调用的东西。在两个convertables的情况下,这不重要。我最终走的是同一个方向……虽然很糟糕,但

C# 但我担心,如果你想做这样的事情,你最终还是要“自己做”,因为语言对于这类问题只有一种方法:反射…抱歉:(+1用于更新。关于“注释“我想要的是行为类似于动态调用的东西。在两个convertables的情况下,这不重要。我最终走的是同一个方向……虽然很糟糕,但,c#,.net,reflection,dynamic,C#,.net,Reflection,Dynamic,但我担心,如果你想做这样的事情,你最终还是要“自己做”,因为语言对于这类问题只有一种方法:反射…抱歉:(+1用于更新。关于“注释“我想要的是行为类似于动态调用的东西。在两个convertables的情况下,这不重要。我最终走的是同一个方向……虽然很糟糕,但我真的希望找到更好的方法。” SomeUnknownType x; SuperDuperInvoke(x, "MethodName", param1, param2, param3); SuperDuperInvoke2(x, "Metho


但我担心,如果你想做这样的事情,你最终还是要“自己做”,因为语言对于这类问题只有一种方法:反射…抱歉:(+1用于更新。关于“注释“我想要的是行为类似于动态调用的东西。在两个convertables的情况下,这不重要。我最终走的是同一个方向……虽然很糟糕,但我真的希望找到更好的方法。”
SomeUnknownType x;

SuperDuperInvoke(x, "MethodName", param1, param2, param3);

SuperDuperInvoke2(x, "MethodName", "param1String", "param2String", "param3String");
var result = x.GetType().GetMethod( "MethodName" ).Invoke( x, new object[] { methodParams });
var method = x.GetType()
              .GetMethods()
              .First(m => m.Name == "MethodName" && m.GetParameters().Length == 2);
var result = method.Invoke( x, new object[] { methodParams });
public static object InvokeMethod(object o, string MethodName, object[] parameters)
{
    // get the types of the params
    List<Type> paramTypes = new List<Type>();
    foreach (object p in parameters)
    {
        paramTypes.Add(p.GetType());
    }

    try
    {
        // get the method, equal to the parameter types
        // considering overloading
        MethodInfo methodInfo = o.GetType().GetMethod(MethodName, paramTypes.ToArray());

        // and invoke the method with your parameters
        return methodInfo.Invoke(o, parameters);
    }
    catch (MissingMethodException e)
    {
        // discard or do something
    }
}
public static SuperDuperInvoke(object o, string methodName, params object parameters)
{
    Type t = o.GetType();
    MethodInfo mi = t.GetMethod(methodName);
    if (mi == null) throw new Exception("no such method: " + methodName);
    mi.invoke(mi, o, parameters.Length == 0 ? null : parameters);
}
public static dynamic SuperDuperInvoke(object target, string methodName, params object[] args){
    try{
        return Impromptu.InvokeMember(target, methodName, args);
    }catch(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException){
        Impromptu.InvokeMemberAction(target, methodName, args);
        return null;
    }
}
public static dynamic SuperDuperInvoke2(object target, string methodName, params ConvertableProxy[] args){
    return SuperDuperInvoke(target,methodName,args);
}

public class ConvertableProxy{
    private IConvertible _value;
    public ConvertableProxy(IConvertible value){
        _value =value;
    }

    //Automatically convert strings to proxy
    public static implicit operator ConvertableProxy(string value){
        return new ConvertableProxy(value);
    }

    public static implicit operator bool(ConvertableProxy proxy)
    {
        return proxy._value.ToBoolean(null);
    }

    public static implicit operator int(ConvertableProxy proxy)
    {
        return proxy._value.ToInt32(null);
    }

    public static implicit operator string(ConvertableProxy proxy)
    {
        return proxy._value.ToString(null);
    }

    //.. Add Char, DateTime, etc.


}