使用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);
这些都按预期工作,但我很好奇。为什么第一种方式不起作用?
答案 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>();
显然只能用于默认构造函数,通常就是这种情况。