Próbuję skonstruować DynamicObject
, który jest w stanie obsłużyć ogólne wywołania metod, ale wydaje się, że potrzebny interfejs API - chociaż obecny w RC versions of 4.0 Framework - został oznaczony jako wewnętrzny w RTM (a mianowicie, CSharpInvokeMemberBinder
jest teraz wewnętrzny). Czy istnieje odpowiednik tego kodu, który działałby w wersji 4.0 RTM?Jak obsłużyć ogólne wywołania metod w moim DynamicObject?
public class TransparentObject<T> : DynamicObject {
private readonly T target;
public TransparentObject(T target) {
this.target = target;
}
public override bool TryInvokeMember(
InvokeMemberBinder binder, object[] args, out object result) {
var csBinder = binder as CSharpInvokeMemberBinder;
var method = typeof(T).GetMethod(binder.Name, BindingFlags.Public
| BindingFlags.NonPublic | BindingFlags.Instance);
if (method == null)
throw new MissingMemberException(string.Format(
"Method '{0}' not found for type '{1}'", binder.Name, typeof(T)));
if (csBinder.TypeArguments.Count > 0)
method = method.MakeGenericMethod(csBinder.TypeArguments.ToArray());
result = method.Invoke(target, args);
return true;
}
}
(Kod wzięty z http://bugsquash.blogspot.com/2009/05/testing-private-methods-with-c-40.html)
Zdaję sobie sprawę, że mogę użyć refleksji uzyskać parametry typu rodzajowego tutaj, ale szukam ładniejszy rozwiązania - jeśli istnieje.
Dupe http://stackoverflow.com/questions/5492373/get-generic-type-of-call-to-method-in-dynamic-object – jbtule
Chociaż możesz nie potrzebować do nich dostępu, jeśli będziesz zadowolony z wnioskowania generycznych przez DLR na przekazanej metodzie, użyj [ImpromptuInterface]: http: //code.google.com/p/impromptu-interface/wiki/UsageReallyLateBinding to won Działają dla leków generycznych, których nie można wywnioskować, ale będą szybsze niż refleksja. – jbtule
@jbtule działa w trybie Średniego zaufania? –