powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / T не содержит определения для (поля класса). Третий час сижу
11 сообщений из 11, страница 1 из 1
T не содержит определения для (поля класса). Третий час сижу
    #38530072
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый! Бедуевина случилась, помогите разобраться, пожалуйста...
Код: 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
T не содержит определения для (поля класса). Третий час сижу
    #38530085
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если уж так хочется, то можешь попробовать через Reflection вытянуть нужное свойство
...
Рейтинг: 0 / 0
T не содержит определения для (поля класса). Третий час сижу
    #38530092
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллН, ндык... добавь в ограничения базовый класс али интерфейс... от которого все сущности наследуются...
...
Рейтинг: 0 / 0
T не содержит определения для (поля класса). Третий час сижу
    #38530094
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллН,
авторЭто поле присуще всем классам, которые я использую в качестве типа Т.
очень интересное утверждение,
а вот такой тип может встать в вашу коллекцию
class Foo{} - может
а такой - class Ass{} может
и где тут Id?
если это свойство присуще всем типам Т то выделите его в интерфейс, а этот интерфейс добавьте в ограничение типа T , и все
можете с ним ( с полем) работать легально, без всяких рефлексий, и другой тип не реализующий интерфейс не занырнет в вашу коллекцию
...
Рейтинг: 0 / 0
T не содержит определения для (поля класса). Третий час сижу
    #38530118
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
T не содержит определения для (поля класса). Третий час сижу
    #38530120
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллН,
авторСейчас попробую. Можно чуть подробнее про интерфейс. ну не знаете что это такое, примените ко всем типам вашим базовый класс со свойством Id, интерфейсы это тот же базовый абстрактный класс без конструктора IL , вытащенный для нас
под таким загадочным словом
...
Рейтинг: 0 / 0
T не содержит определения для (поля класса). Третий час сижу
    #38530122
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,

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

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

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

Уже приступил.
...
Рейтинг: 0 / 0
T не содержит определения для (поля класса). Третий час сижу
    #38530136
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллН,
создай маленькую соплю в консоли, тип реализующий свой кастомный интерфейс и посмотри что там получилось в байт коде
утилитой 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
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / T не содержит определения для (поля класса). Третий час сижу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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