内联构造函数和InjectFrom调用返回Object

时间:2012-08-22 12:45:22

标签: c# valueinjecter

使用ValueInjecter,我经常发现自己编写这样的代码:

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

但是,出乎意料的是,导致foo1的类型为Object,而不是Foo。与

相同
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 个答案:

答案 0 :(得分:4)

我没有使用ValueInjecter,但我想假设InjectFrom方法返回对象值。  由于var是糖语法,并且在编译期间自动定义变量类型,因此该变量被定义为Object。  这就是为什么你必须使用显式类型转换来使这个工作。

答案 1 :(得分:1)

尝试添加自定义扩展方法:

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

答案 2 :(得分:1)

你也可以这样写:

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

答案 3 :(得分: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>();

显然只能用于默认构造函数,通常就是这种情况。