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

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. У меня в приложении выполняется одно действие два раза, но с разными объектами. Вот первое действие:
Листинг программы
  1. private void LoadUserData()
  2. {
  3. if (File.Exists(ApplicationPath.UserBasePath))
  4. {
  5. var ReaderStream = File.Open(ApplicationPath.UserBasePath, FileMode.Open);
  6. if (ReaderStream.Length > 0)
  7. {
  8. var Formatter = new BinaryFormatter();
  9. AllUsers = Formatter.Deserialize(ReaderStream) as Users;
  10. }
  11. ReaderStream.Close();
  12. }
  13. else
  14. {
  15. File.Create(ApplicationPath.UserBasePath).Close();
  16. }
  17. if (AllUsers == null)
  18. AllUsers = new Users();
  19. }
А вот второе (на самом деле у

меня нет второго

, просто я предположил, что будет как-то глупо и надо сделать получше):
Листинг программы
  1. private void LoadUserData()
  2. {
  3. if (File.Exists(UserPath))
  4. {
  5. var ReaderStream = File.Open(UserPath, FileMode.Open);
  6. if (ReaderStream.Length > 0)
  7. {
  8. var Formatter = new BinaryFormatter();
  9. UserPasswords = Formatter.Deserialize(ReaderStream) as List<Password>;
  10. }
  11. ReaderStream.Close();
  12. }
  13. else
  14. {
  15. File.Create(ApplicationPath.UserBasePath).Close();
  16. }
  17. if (UserPasswords == null)
  18. UserPasswords = new List<Password>();
  19. }
Подумал и предположил, что это можно сделать одним методом, принимая различные аргументы (Серьезна?), но застопорился на одном моменте.
Листинг программы
  1. private void LoadUserData<T>(string Path, object Obj)
  2. {
  3. if (File.Exists(Path))
  4. {
  5. var ReaderStream = File.Open(Path, FileMode.Open);
  6. if (ReaderStream.Length > 0)
  7. {
  8. var Formatter = new BinaryFormatter();
  9. Obj = (T)Convert.ChangeType(Formatter.Deserialize(ReaderStream), typeof(T));
  10. }
  11. ReaderStream.Close();
  12. }
  13. else
  14. {
  15. File.Create(Path).Close();
  16. }
  17. if (Obj == null)
  18. Obj = new T();
  19. }
На моменте Obj = new T();. Каак видно, я принимаю тип T и объект, после (операций с файлом и) чего мне необходимо инициализировать объект типа

T

и записать его в

Obj

для дальнейшего возврата. Реально ли такое действие? Если да, то каким образом возможно реализовать такое? Проблему решил путем её обхода.
Листинг программы
  1. AllUsers = LoadUserData(ApplicationPath.UserBasePath, AllUsers);
  2. if (AllUsers == null)
  3. AllUsers = new Users();UserPasswords = firstWindow.LoadUserData(ApplicationPath.GetUserPasswordsFile(CurrentUser), UserPasswords);
  4. if (UserPasswords == null)
  5. UserPasswords = new List<Password>();
Но все равно интересно реально ли такое действие.

Решение задачи: «Создание объекта типа T»

textual
Листинг программы
  1. private T LoadUserData<T>(string Path) where T : class, new()
  2. {
  3.     T result = null;
  4.     if (File.Exists(Path))
  5.     {
  6.         using (var fstream = File.Open(Path, FileMode.Open))
  7.         {
  8.             if (fstream.Length > 0)
  9.             {
  10.                 var formatter = new BinaryFormatter();
  11.                 result = (T)formatter.Deserialize(fstream);
  12.             }
  13.         }
  14.     }
  15.     else
  16.     {
  17.         File.Create(Path).Close();
  18.     }
  19.  
  20.     return result ?? new T();
  21. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы