C # - конвертировать строку в объект класса - PullRequest
3 голосов
/ 08 июля 2011

Я работаю с чужим кодом и пытаюсь внести некоторые изменения.Так что мне нужно сделать следующее:

RemoteFileDP remoteFile = new DPFactory().CreateRemoteFileDP(configData);

И изменить его так, чтобы remoteFile мог равняться тому, что находится в строковой переменной.Для дальнейшего объяснения позвольте мне дать еще немного кода:

ConfigDP configData = new ConfigDP();

Таким образом, приведенный выше оператор выполняется перед оператором remoteFile, а ConfigDP имеет два класса над ним (абстрактный Config, а затем его основание: абстрактный ConfigBase),DP также является потомком двух абстрактных классов над ним (абстрактного RemoteFile и абстрактного RemoteFileBase).

Насколько я понимаю, remoteFile - это результат данных, извлеченных из запроса к базе данных, сохраненных в списке или в Hashtable (извините, простостажер, так что я работаю через это).

Причина, по которой мне нужен remoteFile для принятия строкового значения, заключается в том, что существует МНОГИЕ методы, использующие информацию в remoteFile, и я хотел бы избежать создания целого ГЛАВА перегруженных методов, которые принимают строковое значение вместоRemoteFileDP remoteFile.

Так что, если я могу принять строковое значение типа:

string locationDirectory;

, которое передается из другого метода и затем имеет что-то похожее на следующее:

RemoteFileDP remoteFile = locationDirectory;

тогда все другие методы, использующие remoteFile, не должны быть перегружены или изменены.

Извините за все детали, но это мой первый пост, поэтому я надеюсь, что предоставил достаточно информации.Я посмотрел на C # Преобразование динамической строки в существующий класс и C #: создание объекта с типом, определенным во время выполнения , и написал следующий код:

RemoteFilesDP remoteFile = (RemoteFileDP)Activator.CreateInstance(typeof(RemoteFileDP), locationDirectory);

Однако я продолжаю получать сообщение об ошибке «MissingMethodException», что конструктор для RemoteFileDP не найден, но у меня есть конструктор, как показано ниже:

public RemoteFileDP()
    {
    } //end of RemoteFilePlattsDP constructor

Заранее спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 08 июля 2011

Если вы не хотите изменять исходный проект, в котором RemoteFileDP живет (или не может), вы можете написать метод расширения, например ниже:

public static RemoteFileDP ConvertToRemoteFileDP(this string location)
{
    // Somehow create a RemoteFileDP object with your 
    // location string and return it
}

Таким образом, вы можете запуститьстрока кода, которую вы хотите:

RemoteFileDP remoteFile = locationDirectory;

С небольшим изменением следующим образом:

RemoteFileDP remoteFile = locationDirectory.ConvertToRemoteFileDP();

Позволит ли это решить вашу проблему?

1 голос
/ 08 июля 2011

Хотя мне нравится идея, что конструктор принимает string больше, вы можете определить неявный или явный оператор преобразования между RemoteFileDP и string:

 class RemoteFileDP
 {
      ....

      public static implicit operator RemoteFileDP(string locationDictionary)
      {
           //return a new and appropiately initialized RemoteFileDP object.
           //you could mix this solution with Anna's the following way:
           return new RemoteFileDP(locationDictionary);
      }
 }

Таким образом, вы могли бы на самом деленапишите:

 RemoteFileDP remoteFile = locationDirectory;

или, если оператор преобразования должен быть явным:

 RemoteFileDP remoteFile = (RemoteFileDP)locationDirectory;

Тем не менее я настаиваю, решение Анны Лир лучше, поскольку неявное или явное преобразование на самом деле не кажетсячтобы лучше всего подходить для такого рода дел.Например, если преобразование может завершиться неудачно из-за неверного значения locationDictionary, я бы не рекомендовал этот путь.Если преобразование всегда будет успешным, независимо от того, какое значение locationDictionary (за исключением null), тогда это может быть правильным решением вашей проблемы.

Я просто кладу это на стол, как я думаю, что выможет оказаться полезным узнать о преобразованиях explicit и implicit в C #, если вы этого еще не сделали.

1 голос
/ 08 июля 2011

Вам не хватает конструктора, который принимает string в качестве параметра.Попробуйте свой код с

public RemoteFileDP(string locationDirectory)
{
    // do stuff with locationDirectory to initialize RemoteFileDP appropriately
}

Конечно, если вы это сделаете, почему бы просто не вызвать конструктор напрямую?

RemoteFileDP remoteFile = new RemoteFileDP(locationDirectory);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...