Неявное преобразование в 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";

обрабатывается следующим образом:

  1. Первый конвертировать "some string" в PathSelector (через оператора конвертации)
  2. Присвойте новый объект свойству

Реализация оператора преобразования не имеет возможности достичь или узнать о цели возвращаемого объекта, будь то свойство, переменная или что-то еще.

Так что нет. Это не может быть сделано.

Вам придется вручную вносить изменения, если вы хотите постоянно создавать новые экземпляры.

x.PluginPathSelector.Path = "some string";

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

  • наследование класса, который содержит свойство PathSelector от DynamicClass
  • переопределить функцию TrySetMember
  • обработать преобразование и установить свойство Path в этой функции
Другие вопросы по тегам