기본 키워드 :C# 생성자 나는 반사경을 사용하여 Microsoft.Practices.Prism 어셈블리에 파고와 DelagateCommand의 생성자에 대한 다음과 같은 정의를 건너 왔어요했다
public DelegateCommand(Action executeMethod, Func<bool> canExecuteMethod)
: base(action, func)
{
Action<object> action = null;
Func<object, bool> func = null;
if (action == null)
{
action = o => executeMethod();
}
if (func == null)
{
func = o => canExecuteMethod();
}
if ((executeMethod == null) || (canExecuteMethod == null))
{
throw new ArgumentNullException(
"executeMethod",
Resources.DelegateCommandDelegatesCannotBeNull);
}
}
이 코드는 처음 두에 : base(action, func)
점 때문에 컴파일되지 않습니다 ctor의 변수.
이런 종류의 동작을 복제 할 수 있습니까? 아마 anon 방법의 사용에 의해?
입력 해 주셔서 감사합니다. 이 방법
반사판 IL은 :
.method public hidebysig specialname rtspecialname instance void .ctor(class [mscorlib]System.Action executeMethod, class [mscorlib]System.Func`1<bool> canExecuteMethod) cil managed
{
.maxstack 5
.locals init (
[0] class [mscorlib]System.Action`1<object> action,
[1] class [mscorlib]System.Func`2<object, bool> func,
[2] class Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6 class2)
L_0000: ldnull
L_0001: stloc.0
L_0002: ldnull
L_0003: stloc.1
L_0004: newobj instance void Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::.ctor()
L_0009: stloc.2
L_000a: ldloc.2
L_000b: ldarg.1
L_000c: stfld class [mscorlib]System.Action Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::executeMethod
L_0011: ldloc.2
L_0012: ldarg.2
L_0013: stfld class [mscorlib]System.Func`1<bool> Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::canExecuteMethod
L_0018: ldarg.0
L_0019: ldloc.0
L_001a: brtrue.s L_0029
L_001c: ldloc.2
L_001d: ldftn instance void Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::<.ctor>b__2(object)
L_0023: newobj instance void [mscorlib]System.Action`1<object>::.ctor(object, native int)
L_0028: stloc.0
L_0029: ldloc.0
L_002a: ldloc.1
L_002b: brtrue.s L_003a
L_002d: ldloc.2
L_002e: ldftn instance bool Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::<.ctor>b__3(object)
L_0034: newobj instance void [mscorlib]System.Func`2<object, bool>::.ctor(object, native int)
L_0039: stloc.1
L_003a: ldloc.1
L_003b: call instance void Microsoft.Practices.Prism.Commands.DelegateCommandBase::.ctor(class [mscorlib]System.Action`1<object>, class [mscorlib]System.Func`2<object, bool>)
L_0040: ldloc.2
L_0041: ldfld class [mscorlib]System.Action Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::executeMethod
L_0046: brfalse.s L_0050
L_0048: ldloc.2
L_0049: ldfld class [mscorlib]System.Func`1<bool> Microsoft.Practices.Prism.Commands.DelegateCommand/<>c__DisplayClass6::canExecuteMethod
L_004e: brtrue.s L_0060
L_0050: ldstr "executeMethod"
L_0055: call string Microsoft.Practices.Prism.Properties.Resources::get_DelegateCommandDelegatesCannotBeNull()
L_005a: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string, string)
L_005f: throw
L_0060: ret
}
은 또한 다음과 같은 방법의 정의는 CodePlex의에서 실제 source code에보고 한 후 :
public DelegateCommand(Action<T> executeMethod, Func<T, bool> canExecuteMethod)
: base((o) => executeMethod((T)o), (o) => canExecuteMethod((T)o))
{
if (executeMethod == null || canExecuteMethod == null)
throw new ArgumentNullException("executeMethod", Resources.DelegateCommandDelegatesCannotBeNull);
#if !WINDOWS_PHONE
Type genericType = typeof(T);
// DelegateCommand allows object or Nullable<>.
// note: Nullable<> is a struct so we cannot use a class constraint.
if (genericType.IsValueType)
{
if ((!genericType.IsGenericType) || (!typeof(Nullable<>).IsAssignableFrom(genericType.GetGenericTypeDefinition())))
{
throw new InvalidCastException(Resources.DelegateCommandInvalidGenericPayloadType);
}
}
#endif
}
예, 소스에 따라 실제 기본 호출입니다 (소스에 중복 괄호가 있음 : P 제외) ... PrismLibrary \ Desktop \ Prism \ Commands \ DelegateCommand.cs – BoltClock
@ BoltClock'saUnicorn,이 경우에는 리플렉터 OP와는 틀림이 틀림 없습니다 - 올바른 출력을 얻지 못합니다 ... 건방진 상태에서 내 .pdb를 프로빙하지 않는 한 –
분명히 반사경 버그이지만이 코드는 정말 재미 있습니다! –