0

モデルに再帰的なプロパティを含めることは可能ですか? 目標は、各アクションで文字列を動的に構築することです。ここに私が取り組んでいるものがあります:

public class Action
{
    public int ActionId { get; set; }
    public int? ParentId { get; set; }
    public string Name { get; set; }
    public string ActionName { 
    {
        get
        {
            // example result: 1Ai or 2Bi
            return ....
        }
    }
}

List<Action> aList = new List<Action>() {
    new Action { ActionId = 1, Name = "Step 1" },
    new Action { ActionId = 2, Name = "Step 2" },
    new Action { ActionId = 3, ParentId = 1, Name = "A" },
    new Action { ActionId = 4, ParentId = 1, Name = "B" },
    new Action { ActionId = 5, ParentId = 2, Name = "A" },
    new Action { ActionId = 6, ParentId = 2, Name = "B" },
    new Action { ActionId = 5, ParentId = 3, Name = "i" },
    new Action { ActionId = 6, ParentId = 6, Name = "i" }
}
4

2 に答える 2

0

これを行うには多くの方法がありますが、考えられるアプローチの 1 つです。

    class Program
    {
        static List<Action> aList;

        static void Main(string[] args)
        {
            aList = new List<Action>() {
    new Action { ActionId = 1, Name = "Step 1" },
    new Action { ActionId = 2, Name = "Step 2" },
    new Action { ActionId = 3, ParentId = 1, Name = "A" },
    new Action { ActionId = 4, ParentId = 1, Name = "B" },
    new Action { ActionId = 5, ParentId = 2, Name = "A" },
    new Action { ActionId = 6, ParentId = 2, Name = "B" },
    new Action { ActionId = 5, ParentId = 3, Name = "i" },
    new Action { ActionId = 6, ParentId = 6, Name = "i" }
};
            Console.WriteLine(aList[2].ActionName);
            Console.ReadKey();

        }

        public class Action
        {
            public int ActionId { get; set; }
            public int? ParentId { get; set; }
            public string Name { get; set; }
            public string ActionName
            {

                get
                {
                    // example result: 1Ai or 2Bi
                    var parent = aList.Find((p) => p.ActionId == ParentId).ActionId;
                    var child = aList.Find((p) => p.ParentId == ActionId).Name;
                    return  String.Format("{0}{1}{2}", parent, Name, child) ;
                }
            }
        }
    }
于 2012-10-05T21:30:44.840 に答える
0

確かに可能です (再帰的とは言いませんが)。コンストラクターで親を渡すことでそれを行うことができます。

public class Foo
{
   public Foo(string name)
   {
      Name = name;
   }

   public Foo(Foo parent, string name)
   {
      Name = parent.Name + name;
   }

   public string Name {get; set;}
}

//


var foo = new Foo("Step 1");
var bar = new Foo(foo, "A");

// etc.

子クラスの親クラス全体への参照を保持したい場合があります。たとえば、 name プロパティを最新バージョンでオンザフライで生成できます。

これは確かに呼び出しのカスケードを生成します (注意してください!)

public class Foo
{
   string _innerName;

   public Foo(string name)
   {
      _innerName = name;
   }

   public Foo(Foo parent, string name)
   {
      _innerName = name;
      _parent = parent;
   }

   public string Name
   {
      get
      {
         return parent == null? _innerName; parent.Name + _innerName;
      }
   }
}

//


var foo = new Foo("Step 1");
var bar = new Foo(foo, "A");

// etc.
于 2012-10-05T21:23:08.460 に答える