2011-07-07 61 views
3

我正在处理我的c#.net应用程序并使用Ninject实现IoC/DI模式,现在Ninject有一个名为ConstructorArgument的类,它带有两个参数(argName,argValue)。构造函数参数枚举和魔术字符串

所以我需要通过静态argName像这样

new ConstructorArgument("strVar","") 

通过硬编码字符串不似乎是一个不错的选择。

所以我想创建一些像使用反射构造函数参数的动态枚举,所以我不需要传递硬编码的字符串。

请引导我完成这个过程,或者建议我采取其他措施来实现这一目标。

回答

3

像动力学枚举

没有这样的构建体容易获得。如果确实是讨厌字符串,那么可以编写某种表达式树lambda(即() => new Foo(strVal: "")() => new Foo(""),但是:a:有很多工作,而b:如果还有其他参数提供的容器

说实话,这是一个非问题,特别是因为命名参数意味着参数名称应该被视为一个合同IMO只是使用字符串如果它担心你,请确保你在单元测试中覆盖了场景,以便在发生变化时尽早发现。

2

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

我已经imlemented这样的:

public string GiveConstuctorArgumentName(Type class, Type constructorArgument) 
    { 
     var cons = class.GetConstructors(); 

     foreach (var constructorInfo in cons) 
     { 
      foreach (var consParameter in constructorInfo.GetParameters()) 
      { 
      if (consParameter.ParameterType == constructorArgument) 
      { 
       return consParameter.Name; 
      } 
      } 
     } 

     throw new InstanceNotFoundException(); 
    } 

它没有LINQ,但它的一个很好的起点,以了解其工作。