我有一个类,它将对象类型返回给变量。变量必须知道在对其执行操作时实际类型是什么:
public object Data
{
get
{
switch (CriteriaID)
{
case (int)matrix2.enums.NodeTypeEnums.Enums.MultiLineText:
return (string)_Data;
case (int)matrix2.enums.NodeTypeEnums.Enums.SingleLineText:
return (string)_Data;
case (int)matrix2.enums.NodeTypeEnums.Enums.Number:
int temp = 0;
return int.TryParse((string)_Data, out temp) ? (int?)temp : null;
case (int)matrix2.enums.NodeTypeEnums.Enums.Price:
decimal temp1 = 0;
return decimal.TryParse((string)_Data, out temp1) ? (decimal?)temp1 : null;
case (int)matrix2.enums.NodeTypeEnums.Enums.PullDown:
return (string)_Data;
case (int)matrix2.enums.NodeTypeEnums.Enums.Checkbox:
bool temp2 = false;
return bool.TryParse((string)_Data, out temp2) ? (bool?)temp2 : null;
case (int)matrix2.enums.NodeTypeEnums.Enums.Date:
DateTime temp3 = DateTime.MinValue;
return DateTime.TryParse((string)_Data, out temp3) ? ((DateTime?)temp3).Value.ToString("MM/dd/yyyy") : null;
case (int)matrix2.enums.NodeTypeEnums.Enums.Link:
return (string)_Data;
case (int)matrix2.enums.NodeTypeEnums.Enums.Image:
return (string)_Data;
default:
return (string)_Data;
}
}
set
{
_Data = value;
}
}
data属性的用法如下:
temp.Count() > 0 ? temp.FirstOrDefault().Data : " "
像这样使用它有效,但我不确定这是否是最好的实现和/或最有效。他们是更好的方法吗?
答案 0 :(得分:1)
老实说,看到你处理有限数量的可能结果,你可能会坚持使用switch语句。我会做的是改变你正在做的很多事情......
首先,不要对getter或setter进行任何复杂的操作。你应该把它们推到一个单独的方法:
public object Data
{
get
{
return FormatData(_Data);
}
}
其次,您不需要在案例块中进行投射:
case (int)matrix2.enums.NodeTypeEnums.Enums.MultiLineText:
第三,
temp.Count() > 0 ? temp.FirstOrDefault().Data : " "
......这里有一些问题,例如:
temp.Count() > 0
...将导致枚举整个枚举,其效率更高:
temp.Any()
...因为它会在遇到第一个元素后返回,下一个:
temp.FirstOrDefault().Data
如果您致电.Count() > 0
(或现在希望.Any()
),您可以将其更改为.First()
,因为您已经确定必须有一个实例才能点击temp.FirstOrDefault().Data : " ";
这条逻辑路径。
Int32
因为你的方法可能返回string以外的类型,所以完整的三次操作的结果只能分配给Object,因为编译器不知道它可以分配给哪个参数类型....想象你要返回String
或public object Data { get; set;}
,哪一个?
<强>更新强> 现在我想一想,你应该做的一个非常重要的改变就是:
.ToString()
该属性应该只返回原始数据。它应该在您呈现数据的模型的问题域之外(并因此将其转换为其他类型)。
看起来你基本上是把对象写成html,那么为什么所有的工作都要用格式化呢?在大多数情况下,您可以使用temp.Any() ? temp.First().Data.ToString() : "nbsp;"
来获取对象的字符串表示形式:
{{1}}
答案 1 :(得分:0)
假设您的原始类型与目标类型兼容,您可以执行以下操作:
public T ConvertValue<T>(object value)
{
return (T)Convert.ChangeType(value, typeof(T), null);
}
(或者如果你有不需要IFormatProvider的Convert.ChangeType重载)
public T ConvertValue<T>(object value)
{
return (T)Convert.ChangeType(value, typeof(T));
}
然后通过
消耗它int myValueConvertedToInt = ConvertValue<int>("12345");
但是,如果类型不兼容,即你尝试类似
int myValueConvertedToInt = ConvertValue<int>("XXX");
它会抛出。因此,您需要对要尝试转换的属性进行强有力的验证。我偏向于System.ComponentModel.DataAnnotations属性,用于将验证要求附加到属性。