2011-07-07 58 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,但它的一個很好的起點,以瞭解其工作。