Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / T не содержит определения для (поля класса). Третий час сижу / 11 сообщений из 11, страница 1 из 1
17.01.2014, 19:09
    #38530072
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
День добрый! Бедуевина случилась, помогите разобраться, пожалуйста...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace X3TC_DB
{
    /// <summary>
    /// Класс представляет коллекцию моделей и методы работы с ней
    /// </summary>
    public class ObjectsCollection<T> where T : new() {
        private ArrayList arrObjects;

        public ObjectsCollection() {
            this.arrObjects = new ArrayList();
        }

        public int Add(T obj) {
                return this.arrObjects.Add(obj);
        }
        
        public T GetObjectByID(string id) {
            for (int i = 0; i < this.arrObjects.Count; i++) {
                T curObj = (T) this.arrObjects[i];
                if (curObj.id == id) return curObj;
            }
            return default(T);
        }
    }
}


В 25-ой строке ругается на выделенное поле класса.
Ошибка"T" не содержит определения для "id" и не был найден метод расширения "id", принимающий тип "T" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Это поле присуще всем классам, которые я использую в качестве типа Т. Но это и не важно, т.к. прога даже не компилится.
Уж очень не хочется разделять этот шаблон на кучу классов-близнецов, отличающихся лишь типом элементов массива.

Ваяю: MSA 2003, mdb | VB.NET + mdb/SQL Express | 1Сv8, ТК УП | C# + FDB
...
Рейтинг: 0 / 0
17.01.2014, 19:18
    #38530085
Sergey S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
Если уж так хочется, то можешь попробовать через Reflection вытянуть нужное свойство
...
Рейтинг: 0 / 0
17.01.2014, 19:27
    #38530092
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
КириллН, ндык... добавь в ограничения базовый класс али интерфейс... от которого все сущности наследуются...
...
Рейтинг: 0 / 0
17.01.2014, 19:27
    #38530094
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
КириллН,
авторЭто поле присуще всем классам, которые я использую в качестве типа Т.
очень интересное утверждение,
а вот такой тип может встать в вашу коллекцию
class Foo{} - может
а такой - class Ass{} может
и где тут Id?
если это свойство присуще всем типам Т то выделите его в интерфейс, а этот интерфейс добавьте в ограничение типа T , и все
можете с ним ( с полем) работать легально, без всяких рефлексий, и другой тип не реализующий интерфейс не занырнет в вашу коллекцию
...
Рейтинг: 0 / 0
17.01.2014, 19:48
    #38530118
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
Sergey S,
Не знаю, что это. Попробовал, покурив гугл, так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace X3TC_DB
{
    /// <summary>
    /// Класс представляет коллекцию моделей кораблей/оружия/etc и методы работы с ней
    /// </summary>
    public class ObjectsCollection<T> where T : new() {
        private ArrayList arrObjects;

        public ObjectsCollection() {
            this.arrObjects = new ArrayList();
        }

        public int Add(T obj) {
                return this.arrObjects.Add(obj);
        }
        
        public T GetObjectByID(string id) {
            for (int i = 0; i < this.arrObjects.Count; i++) {
                T curObj = (T) this.arrObjects[i];
                Type typeShip = Type.GetType("Ship");
                object res = null;
                res = typeShip.InvokeMember("id", System.Reflection.BindingFlags.GetField, null, res, null);
                if (res.ToString() == id) return curObj;
            }
            return default(T);
        }
    }
}


Не уверен, что правильно сделал, но выставив точку останова после последней красной строки, этого самого останова так и не увидел. Будто бы последняя красная строка и не выполняется.

Где-то в степи, buser,
Сейчас попробую. Можно чуть подробнее про интерфейс. Ни разу их не пользовал. Правильно понимаю, что вместо шаблонного класса вы предлагаете создать интерфейс (типа IObjectCollection) с пустыми (или прототипами?) методами? Боюсь, что удобство использования шаблонного класса может замениться неудобством интерфейса, каждый из методов которого, насколько я понял, надо описывать в реализующих классах. Если чушь несу - может, поправите примерчиком?..

ЗЫ: Народ, реально огромное спасибо за отзывчивость и участие...
...
Рейтинг: 0 / 0
17.01.2014, 19:51
    #38530120
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
КириллН,
авторСейчас попробую. Можно чуть подробнее про интерфейс. ну не знаете что это такое, примените ко всем типам вашим базовый класс со свойством Id, интерфейсы это тот же базовый абстрактный класс без конструктора IL , вытащенный для нас
под таким загадочным словом
...
Рейтинг: 0 / 0
17.01.2014, 19:54
    #38530122
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
Где-то в степи,

ВО! Об этом я и не подумал... Спасибо!
...
Рейтинг: 0 / 0
17.01.2014, 20:02
    #38530127
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
Где-то в степиинтерфейсы это тот же базовый абстрактный класс без конструктора IL

Уточню:
базовый - реализуемый наследниками
абстрактный - не могущий быть использованным в качестве типа создаваемых объектов
конструктор IL - это что?

плохо, когда самоучка... Знания не систематизированы и появляются хаотично
...
Рейтинг: 0 / 0
17.01.2014, 20:09
    #38530132
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
Где-то в степину не знаете что это такое, примените ко всем типам вашим базовый класс со свойством Id, интерфейсы это тот же базовый абстрактный классесть существенная разница, базовому классу можно наследовать только одному, а интерфейсов можно реализовать несколько в одном классе. Так что лучше изучите интерфейсы - это не так сложно.
...
Рейтинг: 0 / 0
17.01.2014, 20:10
    #38530135
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
Shocker.Pro,

Уже приступил.
...
Рейтинг: 0 / 0
17.01.2014, 20:10
    #38530136
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
T не содержит определения для (поля класса). Третий час сижу
КириллН,
создай маленькую соплю в консоли, тип реализующий свой кастомный интерфейс и посмотри что там получилось в байт коде
утилитой C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe
Код: c#
1.
2.
3.
4.
5.
6.
interface  IId{
 string Id{get;set;}
}
class Foo:IId{
 string Id{get;set;}
}
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / T не содержит определения для (поля класса). Третий час сижу / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]