2

ValueInjecter を使用すると、次のようなコードを書くことがよくあります。

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

しかし、予想外に、foo1 は Foo ではなく 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

4 に答える 4

4

私は ValueInjecter を使用していませんが、InjectFromメソッドがオブジェクト値を返すと思います。そして、varsugar 構文と同様に、コンパイル時に変数の型を自動定義します。この変数は Object として定義されます。そのため、これを機能させるには、明示的な型変換を使用する必要があります。

于 2012-08-22T12:50:51.977 に答える
1

次のように書くこともできます。

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