我有此类称为
BaseMessage
,其中包含字符串字段Message
:
public class BaseMessage
{
public string Message;
...
}
我还有另一个类,它源自
ProcessMessage
::
BaseMessage
comperly此类是在整个项目的500个不同位置中创建的。有时字符串被插值:
public class ProcessMessage : BaseMessage
{
...
}
有时不是:
var ret = new ProcessMessage() { Message = $"Some information {someParam}" };
有时它作为字符串变量传递,因此:
var ret = new ProcessMessage() { Message = "Some information" };
我需要实现的是以某种方式存储插值字符串的模板。我刚刚了解到,您可以使用
var ret = new ProcessMessage() { Message = someMessage };
我尝试了什么我试图以这样的方式超载
FormattableString
字段:
Message
但是这种方法不会编译,因为您无法将普通字符串分配给
public class ProcessMessage : BaseMessage
{
public new FormattableString Message;
...
}
对象。我完全可以存储普通字符串,以存储在FormattableString
属性中。但是,似乎没有正确的方法可以在不编辑整个项目的情况下将字符串转换为
Format
,否则我找不到一个。
我还试图超载分配运算符以在运行时选择类型:
FormattableString
但是这种方法不起作用。 C#总是选择一个普通字符串。我以为您也许您可以创建会从
FormattableString
中获得的班级,但是我不确定如何。
我认为,如果您愿意使用工厂方法而不是隐式超载,则可以使用自定义的.net6+功能来实现它:
public class SpecialString
{
public string StringValue { get; private set; }
public FormattableString FormattableValue { get; private set; }
public static implicit operator SpecialString(string value)
{
return new SpecialString { StringValue = value };
}
public static implicit operator SpecialString(FormattableString value)
{
return new SpecialString { FormattableValue = value };
}
public override string ToString()
{
return FormattableValue?.ToString() ?? StringValue ?? string.Empty;
}
}