我同意@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);
}
}