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



使用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);

这两个都如预期的那样工作,但我很好奇。为什么第一种方法不起作用?

我还没有使用ValueInjecter,但我的假设是InjectFrom方法返回对象值。由于var是sugar语法,并且在编译过程中自动定义变量类型,因此该变量被定义为Object。这就是为什么您必须使用显式类型转换来实现这一点。

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

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

您也可以这样写:

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

几个扩展:

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>();

显然只能与默认构造函数一起使用,这种情况经常发生。

最新更新