C#:你会把字符串转换/翻译功能放在哪里?

C#:你会把字符串转换/翻译功能放在哪里?,c#,wpf,winforms,string,design-patterns,C#,Wpf,Winforms,String,Design Patterns,我有一些相当简单的参数类(至少当您跳过错误检查、事件处理等等时是这样)。它们是这样“组装”起来的: public interface IParameter { Type ValueType { get; } object Value { get; set; } } public interface IParameter<TValue> : IParameter { new TValue Value { get; set; } } public abstra

我有一些相当简单的参数类(至少当您跳过错误检查、事件处理等等时是这样)。它们是这样“组装”起来的:

public interface IParameter
{
    Type ValueType { get; }
    object Value { get; set; }
}

public interface IParameter<TValue> : IParameter
{
    new TValue Value { get; set; }
}

public abstract class ParameterBase<TValue> : IParameter<TValue>
{
    public abstract TValue Value { get; set; }
    object IParameter.Value
    {
        get { return Value; }
        set
        {
            if (value is TValue) Value = (TValue)value;
            else throw new ArgumentException("Wrong type.");
        }
    }
    public Type ValueType { get { return typeof(TValue); } }
}
公共接口i参数
{
类型ValueType{get;}
对象值{get;set;}
}
公共接口IPParameter:IPParameter
{
新的TValue值{get;set;}
}
公共抽象类ParameterBase:ipParameter
{
公共抽象TValue值{get;set;}
对象参数值
{
获取{返回值;}
设置
{
如果(值为TValue)值=(TValue)值;
否则抛出新的ArgumentException(“错误类型”);
}
}
公共类型ValueType{get{return typeof(TValue);}
}
例如,要创建基于整数的参数,您需要创建以下类:

public class NumberParameter : ParameterBase<int>
{
    private int number;
    public override int Value { get { return number; } set {number = value; } }
}
public class NumberParameter:ParameterBase
{
私有整数;
公共重写int值{get{return number;}set{number=Value;}}
}
我的问题是,其中一些参数将在用户界面中具有文本表示。例如,值类型可以是整数列表,但用户应该能够在文本框中键入这些整数,例如用逗号分隔

您会将此翻译/转换功能放在何处?你将如何实施它?有没有一种聪明的方法可以让代码变得整洁

目前,我已经在需要进行此转换的参数中添加了一个
公共字符串ValueAsText
属性,但我觉得它会使parameter类变得杂乱无章,其功能完全不需要关心。我在考虑某种中间类、类型转换器、格式化程序+解析器,或者。。。某物也许只是在胡说八道。。。我有参数和文本框。我可以创建一个格式化程序和一个解析器,用于将值与字符串进行转换。但是,我如何以一种好的方式连接这些点呢

有人明白我的意思吗?有什么好主意吗


澄清:我不想将参数本身转换为字符串,只想将其值显示为字符串并从字符串中设置值。换句话说,参数实例本身必须保持不变



更多说明:在ui中,参数由一个组件表示,该组件通常由一个带有参数名称的标签、一个文本框和/或一些其他输入控件组成。例如,日期参数将有一个文本框(您可以在其中键入日期范围)和一个打开日期选择器的按钮(您可以在其中选择日期范围)。在这种情况下,参数TValue将是
IEnumerable
,这就是该参数真正需要的。但因为我也希望用户能够在文本框中以字符串的形式键入该范围的日期,所以我需要将该字符串转换为某个位置的日期序列。目前,我已经通过向date参数添加ValueAsText属性来实现这一点,该参数进行来回转换。然后,文本框与ValueAsText属性“对话”,日期选择器与ValueAsText属性“对话”。这是可行的,但我觉得参数类做得太多了。我认为翻译工作应该介于两者之间。但不确定在哪里以及如何进行连接。例如,我可以有一个可以将字符串解析为日期序列的范围解析器类和一个可以获取范围并从中创建字符串的范围格式化程序类。但谁会创造它们,它们会生活在哪里?我认为第一步可以是创建这些类,并让它们位于ValueAsText属性的后面。这样一来,大多数功能至少被分离出来了。但我真的不知道。我在寻找想法,想学习。这就是这个问题的原因:)

我认为最干净(最标准)的方法就是在保存到字符串转换的值的类上重写
ToString
方法,并提供
Parse
TryParse
方法来实现另一种方式。

我认为最干净的方法是(和标准)方法是在保存到字符串转换的值的类上重写
ToString
方法,并提供
Parse
TryParse
方法来实现另一种方法。

您想过为您实现
System.ComponentModel.TypeConverter
实现吗
NumberParameter
类型类,使它们成为.NET世界中的一流公民,就像内置类型一样?这样,您不仅可以处理与
字符串的转换(例如,包括
PropertyGrid
控件中的支持,用于编辑“NumberParameter”,而无需额外工作,我认为可以将此类值数据绑定到
TextBox.Text
等)但也可能有其他类型转换/强制转换?

您是否考虑过为您实现
System.ComponentModel.TypeConverter
类型类实现
NumberParameter
类型类,使它们像内置类型一样成为.NET世界中的一流公民?这样,您不仅可以处理与
字符串的转换(例如,包括
PropertyGrid
控件中的支持,用于编辑“NumberParameter”,而无需额外工作,我认为可以将此类值数据绑定到
TextBox.Text
等)但也可能有其他类型转换/强制转换?

这取决于您的需求;在常规中,我将在此处使用
类型转换程序
——支持良好且可扩展:

TypeConverter converter = TypeDescriptor.GetConverter(typeof(TValue));
string text = converter.ConvertToString(value);
value = (TValue)converter.ConvertFromString(text);
这将处理区域性等(请参见重载-使用不变量进行序列化),如果您控制之外的类型没有转换器,您仍然可以添加一个转换器:

TypeDescriptor.AddAttributes(typeof(Person),
    new TypeConverterAttribute(typeof(PersonConverter)));
您也可以将自己的类型装饰为:

[TypeConverter(typeof(PersonConverter))]
public class Person {...}
不过有一个警告:它(
TypeDescriptor