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.
}