2

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

4 回答 4

4

我没有使用 ValueInjecter,但我的假设是该InjectFrom方法返回对象值。和var糖语法一样,在编译期间自动定义变量类型,这个变量被定义为对象。这就是为什么您必须使用显式类型转换才能使其适合您的原因。

于 2012-08-22T12:50:51.977 回答
1

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

public static T InjectFrom<T>(this T obj, T from) //May be from should be object type
{
    return (T) obj.InjectFrom(foo2);
}
于 2012-08-22T12:50:45.223 回答
1

你也可以这样写:

var foo1 = new Foo().InjectFrom(foo2) as Foo;
于 2016-03-28T09:40:23.437 回答
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>();

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

于 2016-06-08T18:45:08.390 回答