2012-08-22 80 views
2

使用ValueInjecter,我經常發現自己寫這樣的代碼:內聯構造函數和InjectFrom調用返回的對象

var foo1 = new Foo().InjectFrom(foo2); 

但是,出乎意料的是,使foo1是Object類型,而不是富的。同樣的,

var foo1 = (new Foo()).InjectFrom(foo2); 

Foo foo1 = new Foo().InjectFrom(foo2); 

將無法​​編譯。這不是什麼大不了的事,因爲我可以很容易地做

var foo1 = (Foo)new Foo().InjectFrom(foo2); 

var foo1 = new Foo(); 
foo1.InjectFrom(foo2); 

和那些工作都如預期,但我很好奇。爲什麼第一種方式不起作用?

回答

4

我沒有使用ValueInjecter,但我的假設是,InjectFrom方法返回對象值。 而且var是糖語法,並在編譯過程中自動定義變量類型,因此將此變量定義爲Object。 這就是爲什麼你必須使用顯式類型轉換來爲你工作。

+0

當然,我現在看到了不同。在第一種情況下,我將foo1的調用結果分配給InjectFrom(foo2),而不是構造函數。謝謝,這是一個正確的方向。 – wohanley

1

嘗試添加自定義擴展方法:

public static T InjectFrom<T>(this T obj, T from) //May be from should be object type 
{ 
    return (T) obj.InjectFrom(foo2); 
} 
1

你可以這樣寫,以及:

var foo1 = new Foo().InjectFrom(foo2) as Foo; 
0

一對夫婦的擴展:

public static class ValueInjecterExtentions 
{ 
    public static T InjectIntoNew<T,TInjection>(this object from) 
     where T: new() 
     where TInjection : Omu.ValueInjecter.Injections.IValueInjection, new() 
    { 
     return (T) new T().InjectFrom<TInjection>(from); 
    } 

    public static T InjectIntoNew<T>(this object from) 
     where T : new() 
    { 
     return (T)new T().InjectFrom(from); 
    } 
} 

用法:

var foo = foo2.InjectIntoNew<Foo>(); 

明明只有使用默認的構造函數,這常常是案子。

相關問題