3

3クラスあると、

A と B はそれぞれ ID プロパティを持ち、その他のさまざまなプロパティを持ちます

および C には ID があり、A と B のプロパティが組み合わされています。

したい

C.InjectFrom(A);
C.InjectFrom(B);

A からの ID が保持され、B によって上書きされないようにします。

明らかに、この単純なケースでは、2 つの呼び出しの順序を逆にすることもできますが、実際の例では、順序の問題を解決できないため、少し複雑です。

基本的に、2 番目のインジェクションでは、最初のインジェクションで既に処理されたものをすべて無視する必要があります。これは、複数のインジェクションのチェーンに続く可能性があります。これらのインジェクションの一部は、同じオブジェクトからのものである可能性もあります

C.InjectFrom(A);
C.InjectFrom<SomeInjector>(A);
C.InjectFrom<SomeInjector2>(A);
C.InjectFrom<SomeInjector3>(A);

4

1 に答える 1

6

どうぞ:

using System;
using System.Collections.Generic;
using Omu.ValueInjecter;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var a = new { Id = 1, P1 = "p1" };
            var b = new { Id = 2, P2 = "p2" };

            var c = new C();

            var propList = new List<string>();
            c.InjectFrom(new HandlePropOnce(propList), a);
            c.InjectFrom(new HandlePropOnce(propList), b);

            Console.WriteLine("Id = {0} P1 = {1} P2 = {2}", c.Id, c.P1, c.P2);
        }
    }

    public class C
    {
        public int Id { get; set; }

        public string P1 { get; set; }

        public string P2 { get; set; }
    }

    public class HandlePropOnce : ConventionInjection
    {
        private readonly IList<string> handledProps;

        public HandlePropOnce(IList<string> handledProps)
        {
            this.handledProps = handledProps;
        }

        protected override bool Match(ConventionInfo c)
        {
            if (handledProps.Contains(c.SourceProp.Name)) return false;

            var isMatch = c.SourceProp.Name == c.TargetProp.Name && c.SourceProp.Type == c.TargetProp.Type;

            if (isMatch) handledProps.Add(c.SourceProp.Name);
            return isMatch;
        }
    }
}
于 2012-08-09T21:33:48.360 に答える