【发布时间】:2011-10-25 22:03:29
【问题描述】:
我正在尝试验证是否可以将传递的变量转换为特定类型。我尝试了以下方法,但无法编译,所以我认为我的做法是错误的(我是 C# 新手)
string myType = "System.Int32";
string myValue = "42";
bool canBeCast = false;
try
{
// try to convert the value to it's intended type to see if it's valid.
var result = (Type.GetType(typeString))dataValue;
canBeCast = true;
}
catch
{
canBeCast = false;
}
我基本上是在尝试避免类似的大量 switch 语句
switch(myType){
case "System.Int32":
try
{
var convertedValue = Convert.ToInt32(myValue);
}
catch (Exception)
{
canBeConverted = false;
}
break;
case "another type":
...
}
编辑:
好的,基本上我有一个已知输入类型的 db 表,如下所示:
CREATE TABLE [dbo].[MetadataTypes] (
[typeName] VARCHAR (50) NOT NULL,
[dataType] VARCHAR (50) NOT NULL,
[typeRegex] VARCHAR (255) NULL
);
其中可能有诸如
之类的数据"StartTime","System.DateTime",null
"TicketId","System.String","$[Ff][0-9]{7}^"
我的函数的输入将是一个 KeyValuePair,类似于
myInput = new KeyValuePair<string,string>("StartTime","31/12/2010 12:00");
我需要检查 KeyValuePair 的值是否属于 MetaDataType 预期的正确数据类型。
编辑答案:
Leon 非常接近我最终想出的解决方案。
作为参考,我的函数现在看起来像这样:
public Boolean ValidateMetadata(KeyValuePair<string, string> dataItem)
{
// Look for known metadata with name match
MetadataType type = _repository.GetMetadataTypes().SingleOrDefault(t => t.typeName == dataItem.Key);
if (type == null) { return false; }
// Get the data type and try to match to the passed in data item.
Boolean isCorrectType = false;
string typeString = type.dataType;
string dataValue = dataItem.Value;
try
{
var cValue = Convert.ChangeType(dataValue, Type.GetType(typeString));
isCorrectType = true;
}
catch
{
isCorrectType = false;
}
//TODO: Validate against possible regex here....
return isCorrectType;
}
【问题讨论】:
-
您期望什么类型的数据?您需要处理哪些?
-
这不是选角,而是转换
-
好的,Int32 只是我可能尝试验证的类型的一个示例。它可以是 DateTime、Boolean、Decimal 等。
-
@Nick:如果你总是来自
string,你需要解析。您应该对您想要它是什么类型有所了解,这就是您使用您提到的每种类型的TryParse方法的地方。 -
唉,Convert.ChangeType(object, type) 仅适用于实现 IConvertible 的对象
标签: c# casting type-conversion