Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1

Создание объекта типа T

03.12.2015, 16:53. Показов 6058. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане.

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

Вот первое действие:
1 действие
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void LoadUserData()
{
    if (File.Exists(ApplicationPath.UserBasePath))
    {
        var ReaderStream = File.Open(ApplicationPath.UserBasePath, FileMode.Open);
 
        if (ReaderStream.Length > 0)
        {
            var Formatter = new BinaryFormatter();
            AllUsers = Formatter.Deserialize(ReaderStream) as Users;
        }
 
        ReaderStream.Close();
    }
 
    else
    {
        File.Create(ApplicationPath.UserBasePath).Close();
    }
 
    if (AllUsers == null)
        AllUsers = new Users();
}

А вот второе (на самом деле у меня нет второго, просто я предположил, что будет как-то глупо и надо сделать получше):
2 действие
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void LoadUserData()
{
    if (File.Exists(UserPath))
    {
        var ReaderStream = File.Open(UserPath, FileMode.Open);
 
        if (ReaderStream.Length > 0)
        {
            var Formatter = new BinaryFormatter();
            UserPasswords = Formatter.Deserialize(ReaderStream) as List<Password>;
        }
 
        ReaderStream.Close();
    }
 
    else
    {
        File.Create(ApplicationPath.UserBasePath).Close();
    }
 
   if (UserPasswords == null)
        UserPasswords = new List<Password>();
}


Подумал и предположил, что это можно сделать одним методом, принимая различные аргументы (Серьезна?), но застопорился на одном моменте.
Виденье
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void LoadUserData<T>(string Path, object Obj)
{
    if (File.Exists(Path))
    {
        var ReaderStream = File.Open(Path, FileMode.Open);
 
        if (ReaderStream.Length > 0)
        {
            var Formatter = new BinaryFormatter();
            Obj = (T)Convert.ChangeType(Formatter.Deserialize(ReaderStream), typeof(T));
        }
 
        ReaderStream.Close();
    }
    else
    {
        File.Create(Path).Close();
    }
 
    if (Obj == null)
        Obj = new T();
 
}

На моменте Obj = new T();. Каак видно, я принимаю тип T и объект, после (операций с файлом и) чего мне необходимо инициализировать объект типа T и записать его в Obj для дальнейшего возврата.

Реально ли такое действие? Если да, то каким образом возможно реализовать такое?




Проблему решил путем её обхода.

Кликните здесь для просмотра всего текста
C#
1
2
3
AllUsers = LoadUserData(ApplicationPath.UserBasePath, AllUsers);
if (AllUsers == null)
    AllUsers = new Users();
C#
1
2
3
4
UserPasswords = firstWindow.LoadUserData(ApplicationPath.GetUserPasswordsFile(CurrentUser), UserPasswords);
 
if (UserPasswords == null)
    UserPasswords = new List<Password>();

Но все равно интересно реально ли такое действие.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2015, 16:53
Ответы с готовыми решениями:

Создание объекта динамического типа
Если метод может принимать объекты разных классов, а потом необходимо создавать объекты класса, которые не известны до компиляции, то как...

Создание объекта зная тип другого объекта
К примеру, у меня есть абстрактный класс Abs, от которого унаследован класс Class1 У меня есть объект obj с типом Class1. Как имея...

Создание объекта параметризованного типа
есть параметризованный класс L-Графа class CLGraph&lt;TVertex extends ACVertex&gt;{ private Vector&lt;TVertex&gt; vertexes; у...

2
880 / 559 / 291
Регистрация: 21.11.2012
Сообщений: 1,554
03.12.2015, 17:05
а еще можно расширить ваш метод на 1 переменную типа type и использовать след. функцию для создания объектаа неизвестного типа:

C#
1
2
3
4
5
6
7
8
9
10
11
 public static object GetNewObject(Type t)
        {
            try
            {
                return t.GetConstructor(new Type[] { }).Invoke(new object[] { });
            }
            catch
            {
                return null;
            }
        }
ну или
C#
1
obj = GetNewObject(obj.GetType());
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
03.12.2015, 17:15
Цитата Сообщение от bodynar Посмотреть сообщение
Но все равно интересно реально ли такое действие.
Реально. На тип-аргумент можно наложить ограничение new(). Тогда компилятор позволит использовать только типы у которых есть public конструктор без аргументов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private T LoadUserData<T>(string Path) where T : class, new()
{
    T result = null;
    if (File.Exists(Path))
    {
        using (var fstream = File.Open(Path, FileMode.Open))
        {
            if (fstream.Length > 0)
            {
                var formatter = new BinaryFormatter();
                result = (T)formatter.Deserialize(fstream);
            }
        }
    }
    else
    {
        File.Create(Path).Close();
    }
 
    return result ?? new T();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2015, 17:15
Помогаю со студенческими работами здесь

Создание объекта "action" типа "button" определенного назначения
Всем доброго времени суток, уважаемые пользователи форума!!! Суть в следующем. Есть форма (допустим, &quot;Form_1&quot;) и есть кнопка на...

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

Можно ли присвоить объекту основного типа значение объекта пользовательского типа?
Правильно ли я понимаю, что SomeClass obj; int x = obj; или SomeClass obj; int x = 5 + obj;

Cout like: перегрузить оператор<< по примеру объекта cout для extern объекта пользовательского типа
Мне нужен extern объект по примеру cout с перегруженным оператором. Я нечто подобное сделал, только у меня выдаёт ошибку &quot;undefined...

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный в стеке при этом копи конструктор публичный. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru