mvc запрашивает неисчислимое свойство класса - PullRequest
0 голосов
/ 26 января 2012

Итак, у меня есть эта модель настройки

public class ListOfThings
{
    public int Id {get;set;}
    public List<int> DefaultRanks {get;set;}

    static public IEnumerable<ListOfThings> ListOfDefault{
       get {
            listOfDefault = new List<ListOfDefault>();
            listOfDefault.Add(N1);
            listOfDefault.Add(N2);
            listOfDefault.Add(N3);
            return listOfDefault.AsReadOnly();
       }
    }

    static public ListOfThings N1{ get { return new ListOfThings { Id = 1, Addend = new List<int> { 1 }}; } }  
    static public ListOfThings N2{ get { return new ListOfThings { Id = 2, Addend = new List<int> { 1,2 }}; } }
    static public ListOfThings N3{ get { return new ListOfThings { Id = 3, Addend = new List<int> { 1,2,3 }}; } }

    static private ListOfThings n1;
    static private ListOfThings n2;
    static private ListOfThings n3;
    static private List<ListOfThings> listOfDefault;
}

И всякий раз, когда я пытаюсь запросить этот статический Ienumerable, он дает мне нулевое значение.

var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);

И если я попытаюсь это сделать, я получу предупреждение.

ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);

Любой совет приветствуется ..

Спасибо !!-G

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Непонятно, что вы подразумеваете под «это даст мне нулевое значение» - я бы оспорил это с кодом, который вы дали.(Короткая, но полная программа, демонстрирующая проблему, действительно поможет.)

Вторая строка определенно даст сбой во время компиляции на том основании, что Where возвращает IEnumerable<ListOfThings>, а не single ListOfThings.Вы можете захотеть что-то вроде:

ListOfThings test = ListOfThings.ListOfDefault.SingleOrDefault(a => a.Id == 2);

Обратите внимание, что вы никогда не инициализируете или не используете n1, n2 или n3 в коде, который вы дали.Я бы также предположил, что блок итератора сделает ваше свойство ListOfDefault более простым:

static public IEnumerable<ListOfThings> ListOfDefault {
   get {
        yield return N1;
        yield return N2;
        yield return N3;
   }
}
1 голос
/ 26 января 2012

Я пытался воссоздать проблему, было несколько проблем.Я вставил приведенный ниже код

public class ListOfThings
{
    public int Id { get; set; }
    public List<int> DefaultRanks { get; set; }

    static public IEnumerable<ListOfThings> ListOfDefault
    {
        get
        {
            listOfDefault = new List<ListOfThings>();
            listOfDefault.Add(N1);
            listOfDefault.Add(N2);
            listOfDefault.Add(N3);
            return listOfDefault.AsReadOnly();
        }
    }

    static public ListOfThings N1 { get { return new ListOfThings { Id = 1, DefaultRanks = new List<int> { 1 } }; } }
    static public ListOfThings N2 { get { return new ListOfThings { Id = 2, DefaultRanks = new List<int> { 1, 2 } }; } }
    static public ListOfThings N3 { get { return new ListOfThings { Id = 3, DefaultRanks = new List<int> { 1, 2, 3 } }; } }

    static private ListOfThings n1;
    static private ListOfThings n2;
    static private ListOfThings n3;
    static private List<ListOfThings> listOfDefault;
}



class Program
{
    static void Main(string[] args)
    {
        var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
        IEnumerable<ListOfThings> ds = ListOfThings.ListOfDefault.Where(a => a.Id == 2);

    }
}


ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);

возвращает значение Ienumerable, а не единственный объект, который вы хотите, чтобы один или первый объект выполняли что-то вроде

 ListOfThings ds = ListOfThings.ListOfDefault.Where(a => a.Id == 2).FirstOrDefault();
1 голос
/ 26 января 2012

В вашем коде есть некоторые проблемы. Внесенные мной изменения:

// in a getter
listOfDefault = new List<ListOfDefault>(); 
// should be:
listOfDefault = new List<ListOfThings>();

// static getters
static public ListOfThings N1{ get { return new ListOfThings { Id = 1, Addend = new List<int> { 1 }}; } }  
static public ListOfThings N2{ get { return new ListOfThings { Id = 2, Addend = new List<int> { 1,2 }}; } }
static public ListOfThings N3{ get { return new ListOfThings { Id = 3, Addend = new List<int> { 1,2,3 }}; } }
// should be:

static public ListOfThings N1 { get { return new ListOfThings { Id = 1, DefaultRanks = new List<int> { 1 } }; } }
static public ListOfThings N2 { get { return new ListOfThings { Id = 2, DefaultRanks = new List<int> { 1, 2 } }; } }
static public ListOfThings N3 { get { return new ListOfThings { Id = 3, DefaultRanks = new List<int> { 1, 2, 3 } }; } }

И самое главное, вы не вызываете FirstOrDefault () на своем LINQ (если вы хотите получить больше объектов, используйте ToList ()):

var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2).FirstOrDefault();

Так должно работать.

...