Неявное преобразование в C# без создания нового объекта
Я пытаюсь реализовать неявное приведение для объекта. В настоящее время я делаю это:
public class PathSelector
{
private string _path = null;
public string Path
{
get { return _path; }
set
{
if (value != _path)
{
_path = value;
OnPropertyChanged("Path");
}
}
}
static public implicit operator string(PathSelector pathSelector)
{
return pathSelector.Path;
}
static public implicit operator PathSelector(string path)
{
return new PathSelector() { Path = path };
}
}
Как вы можете видеть в актерском составе от String
в PathSelector
Я создаю новый PathSelector
объект.
Я использую это так:
public PathSelector PluginPathSelector { get; set; } = new PathSelector();
public string PluginPath
{
get
{
return PluginPathSelector;
}
set
{
PluginPathSelector = value;
}
}
Что мне не нравится в этом решении, так это то, что я всегда создаю новый объект, когда назначаю строку PathSelector
объект. Это также означает, что в PathSelector
свойство а set
раздел нужен. Я хотел бы назначить string
к объекту, который уже создан. Есть ли способ реализовать это?
2 ответа
Я наконец понял, что ты хотел сделать.
Вы хотели это:
x.PluginPathSelector = "some string";
Чтобы напрямую изменить свойство Path существующего объекта внутри x.PluginPathSelector
вместо того, чтобы строить новый PathSelector
экземпляр и присвоение x.PluginPathSelector
,
Другими словами, вы хотите это:
x.PluginPathSelector = "some string";
быть бесшумным, как если бы вы написали:
x.PluginPathSelector.Path = "some string";
Но из оператора статического преобразования:
static public implicit operator PathSelector(string path)
И нет, этого нельзя сделать, потому что это оператор преобразования.
Это утверждение:
x.PluginPathSelector = "some string";
обрабатывается следующим образом:
- Первый конвертировать
"some string"
вPathSelector
(через оператора конвертации) - Присвойте новый объект свойству
Реализация оператора преобразования не имеет возможности достичь или узнать о цели возвращаемого объекта, будь то свойство, переменная или что-то еще.
Так что нет. Это не может быть сделано.
Вам придется вручную вносить изменения, если вы хотите постоянно создавать новые экземпляры.
x.PluginPathSelector.Path = "some string";
Для полноты и для взлома вы можете справиться с этим, используя уродливый способ:
- наследование класса, который содержит свойство PathSelector от DynamicClass
- переопределить функцию TrySetMember
- обработать преобразование и установить свойство Path в этой функции