मैं बस कुछ कोड जोड़ूंगा ... क्योंकि। कोड सुखद नहीं है, मैं सहमत हूं, लेकिन यह काफी सीधे आगे है। उम्मीद है कि इससे किसी ऐसे व्यक्ति की मदद मिलेगी जो इस पर ठोकर खाती है। यह परीक्षण किया जाता है, हालांकि शायद नहीं के साथ-साथ आप उत्पादन परिवेश में चाहते हो जाएगा:
तर्क आर्ग के साथ obj वस्तु पर विधि methodName कॉलिंग:
public Tuple<bool, object> Evaluate(IScopeContext c, object obj, string methodName, object[] args)
{
// Get the type of the object
var t = obj.GetType();
var argListTypes = args.Select(a => a.GetType()).ToArray();
var funcs = (from m in t.GetMethods()
where m.Name == methodName
where m.ArgumentListMatches(argListTypes)
select m).ToArray();
if (funcs.Length != 1)
return new Tuple<bool, object>(false, null);
// And invoke the method and see what we can get back.
// Optional arguments means we have to fill things in.
var method = funcs[0];
object[] allArgs = args;
if (method.GetParameters().Length != args.Length)
{
var defaultArgs = method.GetParameters().Skip(args.Length)
.Select(a => a.HasDefaultValue ? a.DefaultValue : null);
allArgs = args.Concat(defaultArgs).ToArray();
}
var r = funcs[0].Invoke(obj, allArgs);
return new Tuple<bool, object>(true, r);
}
और समारोह ArgumentListMatches से नीचे है, जो मूल रूप से लेता है तर्क शायद GetMethod में पाई जाने वाली जगह:
public static bool ArgumentListMatches(this MethodInfo m, Type[] args)
{
// If there are less arguments, then it just doesn't matter.
var pInfo = m.GetParameters();
if (pInfo.Length < args.Length)
return false;
// Now, check compatibility of the first set of arguments.
var commonArgs = args.Zip(pInfo, (margs, pinfo) => Tuple.Create(margs, pinfo.ParameterType));
if (commonArgs.Where(t => !t.Item1.IsAssignableFrom(t.Item2)).Any())
return false;
// And make sure the last set of arguments are actually default!
return pInfo.Skip(args.Length).All(p => p.IsOptional);
}
LINQ बहुत से, और इस किया गया प्रदर्शन का परीक्षण नहीं किया गया है!
इसके अलावा, यह जेनेरिक फ़ंक्शन या विधि कॉल को संभाल नहीं पाएगा। इससे यह काफी बदसूरत हो जाता है (जैसे GetMethod कॉल दोहराया जाता है)।
यह उत्तर वास्तव में सही के रूप में चिह्नित एक से बेहतर है! –
मैं यह प्रमाणित कर सकता हूं कि यह काम करता है। मैं मानता हूं कि ज्यादातर मामलों में यह एक बेहतर समाधान है और शायद इस तरह चिह्नित किया जाना चाहिए। – N8allan
क्या आप परिणामी 'MethodInfo' या' ConstructorInfo' पर बस "Invoke" (बिना पैरामीटर के) को कॉल कर सकते हैं? – Alxandr