我同意@Mark Gravell的立場,只是混淆器可以重命名非參數,因此建議不會申請在這種情況下,所以在某些情況下,您需要在參數上敲擊以在某些情況下保留名稱。
但我已經建立了這樣的廢話,這將回答你的問題。請不要使用它,因爲我後悔寫它!
static class StaticReflection<TClass>
{
static string PublicConstructorParameterName<TParameter>()
{
return typeof(TClass).GetConstructors(BindingFlags.Public | BindingFlags.Instance).Single().GetParameters().Where(param => param.ParameterType == typeof(TParameter)).Single().Name;
}
internal static ConstructorArgument CreateConstructorArgument<TParameter>(TParameter value)
{
return new ConstructorArgument(PublicConstructorParameterName<TParameter>(), value);
}
internal static ConstructorArgument CreateConstructorArgument<TParameter>(Func<IContext, TParameter> argumentResolver)
{
return new ConstructorArgument(PublicConstructorParameterName<TParameter>(), context => (object)argumentResolver(context));
}
}
哪像這樣工作的:
public class StaticReflectionFacts
{
public class X2
{
}
public class X
{
public X(object param1, X2 param2)
{
}
}
[Fact]
static void DeriveNinjectConstructorArgumentFromPublic()
{
var newArg = StaticReflection<X>.CreateConstructorArgument(new X2());
Assert.Equal("param2", newArg.Name);
}
}