Как мне получить доступ к свойствам этих объектов C #? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть список объектов в C # следующим образом:

var items = new List<object> {
    new { id = 1, parentId = 0, children = new List<object>() },
    new { id = 2, parentId = 3, children = new List<object>() },
    new { id = 3, parentId = 1, children = new List<object>() },
    new { id = 4, parentId = 0, children = new List<object>() }
};

Я хочу получить доступ, например, к свойству id первого объекта в списке, но когда я делаю что-то вродеследующее:

items[0].id

Я получаю следующую ошибку:

«объект» не содержит определения для «id» и нет доступного метода расширения «id», принимающего первыйможет быть найден аргумент типа «объект» (вам не хватает директивы using или ссылки на сборку?)

Как получить доступ к свойствам четырех литералов объекта в списке объектов C # выше?
Спасибо.

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Чтобы получить доступ к членам object, вам необходимо привести его к типу, в котором этот член определен.Это было бы немного сложно, потому что тип является анонимным, но не невозможным:

var items = new List<object> {
    new { id = 1, parentId = 0, children = new List<object>() },
    new { id = 2, parentId = 3, children = new List<object>() },
    new { id = 3, parentId = 1, children = new List<object>() },
    new { id = 4, parentId = 0, children = new List<object>() }
};
T Cast<T>(T ignore, object obj) => (T)obj;
var typedNull = true ? null : new { id = default(int), parentId = default(int), children = default(List<object>) };
var typedObject = Cast(typedNull, items[2]);
Console.WriteLine(typedObject.id);
Console.WriteLine(typedObject.parentId);

Демо

Но вам лучше объявить свой собственный именованный тип для этой целивместо этого.

0 голосов
/ 11 октября 2018

Я думаю, что это более c # способ делать вещи здесь.

class A
{
    public int Id { get; set; }
    public int ParentId { get; set; }

    public List<A> Children { get; } = new List<A>();
}
class Program
{
    static void Main(string[] args)
    {
        var items = new List<A> {
            new A { Id = 1, ParentId = 0},
            new A { Id = 2, ParentId = 3},
            new A { Id = 3, ParentId = 1},
            new A { Id = 4, ParentId = 0}
        };

    }
}
0 голосов
/ 11 октября 2018

Определите тип с нужными вам свойствами:

     public class Foo {

        public Foo(){ 
          Children = new List<Foo>();
        }

            public int Id {get;set;}
            public int? ParentId {get;set;}
            public List<Foo> Children  {get;set;}

        }

   }

, затем:

var items = new List<Foo> {
    new { id = 1, ParentId = 0 },
    new { id = 2, ParentId = 3},
    new { id = 3, ParentId = 1},
    new { id = 4, ParentId = 0}
};
0 голосов
/ 11 октября 2018

Вы можете использовать динамический, так как вы особенно не знаете о типе

var items = new List<object> {
                   new { id = 1, parentId = 0, children = new List<object>() },
                   new { id = 2, parentId = 3, children = new List<object>() },
                   new { id = 3, parentId = 1, children = new List<object>() },
                   new { id = 4, parentId = 0, children = new List<object>() }
};
dynamic dy = items[0];
Console.WriteLine(dy.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...