Я согласен с позицией @Mark Gravell, за исключением того, что обфускаторы могут переименовывать параметры для не-public
ctors, поэтому рекомендации не применимы в этом конкретном случае, поэтому в некоторых случаях вам нужно нажать на [Obfuscation]
на параметр, чтобы сохранить имя в некоторых случаях.
Но я построил такую ерунду, которая отвечала бы на ваш вопрос. Пожалуйста, не используйте это, поскольку я сожалею, что пишу это!
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 );
}
}