Я создал простой тип, который содержит только одно свойство зависимостей "Текст" возвращает строку. Для легкого преобразования из строки в мой тип я написал этот код:
public static implicit operator string(StringDP sdp)
{
return sdp.Text;
}
public static implicit operator StringDP(string str)
{
return new StringDP(str);
}
Я хочу иметь аналогичное преобразование из List<string>
в List<myType>
. Могу ли я это сделать? Или я должен использовать что-то вроде этого:
public List<string> Convert(List<myType> lst);
public List<myType> Convert(List<string> lst);
Спасибо!
Нет, это невозможно. Из документации:
Либо тип аргумента, который нужно преобразовать, либо тип результата преобразования, но не оба, должен быть типом-содержащим.
Оба типа, связанные с вашим гипотетическим неявным преобразованием, являются конкретными версиями общего класса List<T>
. Поскольку вы не можете добавлять операторов в класс List<T>
самостоятельно, и с тех пор, когда должны быть implicit
операторы для достижения вашей цели, это невозможно.
Без дополнительного контекста я признаю, что я не могу точно комментировать неявное преобразование в и из string
которую вы определили. Но в целом вы должны быть очень осторожны с implicit
преобразованиями. Предполагая, что неявное преобразование вашего типа вписывается в "безопасные" рекомендации, преобразование целого списка типа будет "хорошим".
Это преобразование может быть выполнено с помощью специальных методов, таких как ваши примеры. Или вы можете использовать LINQ или метод List<T>.ConvertAll()
. Например:
List<string> listOfString = listOfMyType.Select(item => (string)item).ToList();
List<myType> listOfMyType = listOfString.ConvertAll(item => (myType)item);
// etc.
Однако даже там я бы посоветовал вам быть осторожным в том, как вы используете что-то подобное. Одно дело, чтобы преобразовать один экземпляр значения, но преобразование целой коллекции связано с гораздо большими накладными расходами и, скорее всего, не является правильным способом решения проблемы.
Не знаю, в чем проблема, я не могу предложить альтернативу. Просто чтобы предложить вам быть очень осторожным в пути к дизайну, вы, кажется, направляетесь вниз.