Можно ли определить реакцию класса на неявные попытки приведения? - PullRequest
2 голосов
/ 24 сентября 2019

Для моего класса foo, если я попытаюсь сделать это:

public foo ClassName = new foo();
public string MyString = ClassName;

Я получу очевидную ошибку, поскольку ClassName не является строкой.

Есть ли способзаставить поведение класса в таких случаях?Что-то вроде:

WhenCalledAsString {return self.ToString()}

Ответы [ 3 ]

3 голосов
/ 24 сентября 2019

Да, вы должны реализовать implict operator, например:

public class foo {
  ....

  public static implicit operator string(foo value) {
    if (null == value)
      return null;

    //TODO: put relevant code here, e.g. value.ToString()
    return "it's a foo class!";
  }
}

Тогда вы можете поставить

public foo ClassName = new foo();

// "it's a foo class!";
public string MyString = ClassName;
1 голос
/ 24 сентября 2019

Вы можете переопределить ToString и определить неявный оператор следующим образом:

public class foo
{
    public static implicit operator string(foo f)
    {  
        return f.ToString();
    } 

    public override string ToString()
    {
        return "hello!";
    }
}

Затем вызвать его (например) следующим образом:

public static foo ClassName = new foo();

public static void Main()
{
    string MyString = ClassName;

    Console.WriteLine(MyString);  // hello!
}
0 голосов
/ 24 сентября 2019

Это то, что вы хотите:

class Program
{
    static void Main(string[] args)
    {
        Pizza pizza = new Pizza();
        string test = pizza;
    }
}

public class Pizza
{
    public static implicit operator string(Pizza pizza)
    {
        return pizza?.ToString();
    }
}

Вывод:

Namespace.Pizza


Примечание после редактирования:

Поддерживает даже null значения!

...