我有一个带有 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()
目的地为空,因此我们无法调用.GetType()
在上面。我们也无法调用:
typeof(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");
整个想法是不必在多个地方显式使用类型,这样如果数据类型发生变化,只需在目标对象中进行更改(MyObj.SomeProp
)和数据库中。一定有更好的方法...