【发布时间】:2010-09-20 05:55:59
【问题描述】:
我有一个带有 out 参数的方法,它尝试进行类型转换。基本上:
public void GetParameterValue(out object destination)
{
object paramVal = "I want to return this. could be any type, not just string.";
destination = null; // default out param to null
destination = Convert.ChangeType(paramVal, destination.GetType());
}
问题是通常有人会这样称呼:
string output;
GetParameterValue(output);
这将失败,因为:
destination.GetType()
destination 为空,因此我们不能在其上调用.GetType()。我们也不能调用:
typeof(destination)
因为destination 是变量名而不是类型名。
那么有什么方法可以获取设置为 null 的对象的类型吗?我认为必须有一种方法可以在不分配任何内容的情况下知道存储位置的类型。
只是为了提供更多信息,我正在尝试制作一个实用方法来获取 Oracle 存储过程的输出参数。问题是DbParameter.Value 是对象类型。
对于开发人员来说,理想的做法是:
string val = GetParameterValue("parameterName");
值得注意的是没有类型转换。在实践中,您不知道“等于”的 lparam,所以我选择了:
string val;
GetParameterValue("parameterName", out val);
在方法中,我会知道输出变量的目标类型。我想这是一个糟糕的假设。作为替代,我也写了方法:
public T GetParameterValue<T>(string paramName)
所以开发者可以这样做:
string val = GetParameterValue<string>("parameterName");
我发现明确的“字符串”声明是重复的,特别是因为在实践中,目标可能是对象属性和 oracle 数据类型可能会改变(想想 ORM):
MyObj.SomeProp = GetParameterValue<MyObj.SomeProp.GetType()>("parameterName");
但同样,如果 MyObj.SomeProp 为 null,则 .GetType() 调用将失败。 VM 必须知道MyObj.SomeProp 的类型,即使它为空,对吧?否则它将如何捕获强制转换异常?
要部分解决我自己的问题,我可以这样做:
MyObj.SomeProp = GetParameterValue<typeof(MyObj).GetField("SomeProp").GetType()>("parameterName");
整个想法是不必在多个位置显式使用 Type,因此如果数据类型发生变化,只需在目标对象 (MyObj.SomeProp) 和 DB 中进行更改。必须有更好的方法...
【问题讨论】: