【发布时间】:2020-01-21 15:51:21
【问题描述】:
我正在开发一个处理许多模块的系统,这些模块都有自己的参数集。每个参数值都可以是一种通用数据类型(字符串、整数、长整数、字节数、布尔值)。
为简单起见,参数对象定义如下:
public class Parameter : IParameter
{
public string Name { get; set; }
public object Value { get; set; }
public string ValueType { get; set; }
}
现在,请注意参数 Value 是使用类型“object”声明的。这样做的问题是,在为变量赋值时,我们失去了验证类型是否正确的类型安全性。假设“Value”是一个“int”,我们将其设置为 bool,VS 会在编译前和编译后抱怨。
现在我想知道是否可以以这种方式声明“Value”的所有变体:
public int IIntInterface.Value { get; set; }
public string IStringInterface.Value { get; set; }
public bool IBoolInterface.Value { get; set; }
但是,当将数字/字符串分配给属性“Value”时,首先检查“ValueType”以验证该值,以便在为该参数使用错误类型时标记错误?
基本上,我正在尝试为“对象”类型获得类型安全支持:-)
------------- 更新 ------------
我尽量保持简单,但似乎我应该澄清一些事情。
在客户端,我们最终得到一个 IParameters 列表。这个列表是通过做一些事情来编译的:
IPamameter a = new Parameter { Value = IntVal };
IPamameter b = new Parameter { Value = BoolVal };
var listParams = new Parameters();
listParams.Add(a);
listParams.Add(b);
现在,我尝试使用泛型,但效果不佳,因为 Parameter 的类型不能真正泛型(我认为):
class Program
{
static void Main(string[] args)
{
int IntVal = 10;
bool BoolVal = false;
var a = new Parameter<int> { Value = IntVal };
var b = new Parameter<bool> { Value = BoolVal };
var listParams = new Parameters<T>(); // This does not work, it has to be an actual type, but I want all the params in the same list
listParams.Add(a);
listParams.Add(b);
}
}
public class Parameter<T> : IParameter<T>
{
public string Name { get; set; }
public string ValueType { get; set; }
public T Value { get; set; }
}
public class Parameters<T> : List<IParameter<T>>
{
}
public interface IParameter<T>
{
string Name { get; set; }
string ValueType { get; set; }
T Value { get; set; }
}
【问题讨论】:
-
嗯,您的出发点是禁用类型安全,因此您可以将任何类型分配给变量,但是您想以某种方式拥有它。对我来说没有意义。
-
您的问题的简单答案是“泛型”,但这通常会带您走上一条蜿蜒曲折的漫长道路,就像这样。了解您如何使用
IParameter实例 很重要(对于答案) -
将参数添加到列表后,您希望如何处理这些参数?
-
@Lee,我希望能够修改参数的值(对于不同的参数可以是不同的类型)。但是如果我将一个 bool 分配给一个应该是 int 的值,我希望编译器能够中断
-
您可以在将它们添加到列表之前设置值吗?如果您想将异构参数值存储在同一个列表中,您必然会失去区分不同参数类型的能力。
标签: c# object types intellisense