我有一个带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());
}
Run Code Online (Sandbox Code Playgroud)
问题是,通常会有人称之为:
string output;
GetParameterValue(output);
Run Code Online (Sandbox Code Playgroud)
这将失败,因为:
destination.GetType()
Run Code Online (Sandbox Code Playgroud)
destination为null,因此我们无法调用.GetType()它.我们也不能打电话:
typeof(destination)
Run Code Online (Sandbox Code Playgroud)
因为destination是变量名而不是类型名.
那么有没有办法获得设置为null的对象的类型?我认为必须有一种方法可以知道什么类型的存储位置没有分配任何东西.
只是为了提供更多信息,我试图创建一个实用程序方法来获取Oracle存储过程的输出参数.问题是DbParameter.Value对象类型.
对于开发人员来说,最理想的是:
string val = GetParameterValue("parameterName");
Run Code Online (Sandbox Code Playgroud)
值得注意的是,没有类型的铸造.在实践中,你不知道"等于"的lparam,所以我选择了:
string val;
GetParameterValue("parameterName", out val);
Run Code Online (Sandbox Code Playgroud)
在方法中,我会知道输出变量的目标类型.我猜这是一个不好的假设.作为替代方案,我也写了这个方法:
public T GetParameterValue<T>(string paramName)
Run Code Online (Sandbox Code Playgroud)
所以开发人员可以这样做:
string val = GetParameterValue<string>("parameterName");
Run Code Online (Sandbox Code Playgroud)
我发现显式的"字符串"声明是重复的,特别是因为在实践中,目标可能是对象属性和oracle数据类型可能会改变(想想ORM):
MyObj.SomeProp = GetParameterValue<MyObj.SomeProp.GetType()>("parameterName");
Run Code Online (Sandbox Code Playgroud)
但同样,如果MyObj.SomeProp为null,则该.GetType()调用失败.VM必须知道它的类型MyObj.SomeProp …
如果将对象初始化为null,则无法获取类型信息,因为引用不指向任何内容.
但是,当我调试并将鼠标悬停在变量上时,它会显示类型信息.只显示静态方法,但似乎仍然知道类型.甚至在发布版本中.
调试器是否使用其他信息而不仅仅是某种反射来查找数据类型?怎么知道比我更了解?如果它知道这一点,为什么它不能显示数据类型NullReferenceException?
如果变量被定义为字符串,如果其中的值为null,是否可以测试它?
如果我写:
string b = null;
bool c = b is string;
Run Code Online (Sandbox Code Playgroud)
然后c将为false,因为它会查看内容,该内容为null而不是字符串.
如果我写:
string b = null;
bool c = (b.GetType() == typeof(string));
Run Code Online (Sandbox Code Playgroud)
然后它崩溃,因为s为null,你不能在空值上调用GetType().
那么,我如何检查b以找出它是什么类型?某种反思可能吗?或者有更简单的方法吗?
编辑1:澄清问题!
我的问题有点不清楚,这是我的错.在示例中,它看起来像我正在尝试测试变量的内容.但我想在不查看内容的情况下测试变量本身.在给出的代码示例中,我可以看到b是一个字符串,但是如果我不知道b是否是字符串并且只想测试变量s以查看它是否是字符串.
那么,我怎么知道变量被定义为什么类型?如本例所示,但x是一个未知变量,可能被定义为一个字符串,它也可能是null(因为它可能为null,这个例子不起作用).
bool c = (x.GetType() == typeof(string));
Run Code Online (Sandbox Code Playgroud)
编辑2:工作解决方案!
感谢所有答案,我能够解决它.这就是工作解决方案的成果.我首先创建了一个帮助函数来测试一个变量的定义类型,即使该值为null并且它没有指向任何东西也是如此.
public static Type GetParameterType<T>(T destination)
{
return typeof(T);
}
Run Code Online (Sandbox Code Playgroud)
然后我可以调用此函数并测试我的"疑似字符串",并查明它是否真的是一个字符串.
// We define s as string just for this examples sake but in my "definition" we wouldn't be sure about whether s is a string or not.
string s …Run Code Online (Sandbox Code Playgroud) 当我在Microsoft MSDN上发现这篇文章时,我正在研究可空的bool
您可以使用C#typeof运算符创建表示Nullable类型的Type对象.
所以我尝试用可空的布尔检查:
Console.Write(typeof(bool?)); //System.Nullable`1[System.Boolean]
Run Code Online (Sandbox Code Playgroud)
MSDN上的文章说
您还可以使用System.Reflection命名空间的类和方法来生成表示Nullable类型的Type对象.但是,如果尝试通过使用GetType方法或is运算符在运行时从Nullable变量获取类型信息,则结果是一个Type对象,它表示基础类型,而不是Nullable类型本身.
在Nullable类型上调用GetType会导致在将类型隐式转换为Object时执行装箱操作.因此,GetType始终返回表示基础类型的Type对象,而不是Nullable类型.
如果这是真的,我希望得到相同的结果,.GetType()无论我使用可空的bool还是常规的bool.但这不是发生的事情:
bool a = new bool();
Console.Write(a.GetType()); //Prints System.Boolean
bool? b = new bool?();
Console.Write(b.GetType()); //Exception!
Run Code Online (Sandbox Code Playgroud)
发生的例外情况:
BoolTest.exe中出现未处理的"System.NullReferenceException"类型异常
附加信息:未将对象引用设置为对象的实例.
但是对象引用设置为对象的实例.可能是导致此错误的原因是什么?
is关键字的MSDN文档说:
expression is not null
Run Code Online (Sandbox Code Playgroud)
为什么?如果调用了MethodThatReturnsNull()类型,则不应返回false,因为null肯定不是那种类型?
protected static SqlParameter CreateParameter(string name, object value, bool skipEmpty, bool isOutput =false)
{
if (skipEmpty && value is string && string.IsNullOrEmpty((string)value))
return null;
//1
if (skipEmpty && value is int? && value == null)
return null;
//2
if (skipEmpty && value is Guid? && value == null)
return null;
//....................
}
Run Code Online (Sandbox Code Playgroud)
resharper说1和2条款总是错误的.但为什么?
有没有办法得到一个null值的类型?这不起作用:
let a: string = null
let typ = a.GetType()
Run Code Online (Sandbox Code Playgroud)
谢谢
如何在视图本身中找出视图模型的类型?
我试着打电话GetType:
@model MyModel
<div>@Model.GetType()</div>
Run Code Online (Sandbox Code Playgroud)
除非Model为空,否则有效,在这种情况下,我得到一个NullReferenceException.
不幸的是,这也是不可能的
@model MyModel
<div>@typeof(TModel)</div>
Run Code Online (Sandbox Code Playgroud)
asTModel在 Razor 视图的上下文中不可用。