gpt4 book ai didi

c# - 反射(reflect)类型的默认值(T)

转载 作者:太空狗 更新时间:2023-10-30 00:03:34 29 4
gpt4 key购买 nike

在浏览其他答案时,我想出了以下扩展方法,它很有用:

public static T Convert<T>( this string input )
{
var converter = TypeDescriptor.GetConverter( typeof( T ) );
if ( converter != null )
{
try
{
T result = (T) converter.ConvertFromString( input );
return result;
}
catch
{
return default( T );
}
}
return default( T );
}

我可以像这样使用它:

string s = "2011-09-21 17:45";
DateTime result = s.ConvertTo( typeof( DateTime ) );
if ( result == DateTime.MinValue )
doSomethingWithTheBadData();

太棒了!效果很好。现在,我想对反射类型做类似的事情。我有:

public static dynamic ConvertTo( this string input, Type type )
{
var converter = TypeDescriptor.GetConverter( type );
if ( converter != null )
{
try
{
dynamic result = converter.ConvertFromString( input );
return ( result );
}
catch
{
return default( type ); // bogus
}
}

return default( type ); // bogus
}

我想这样使用它:

Type someType;  // will be DateTime, int, etc., but not known until runtime
DateTime result = s.ConvertTo( sometype );
if ( result == DateTime.MinValue )
doSomethingWithTheBadData();

当然,编译器反对 ConvertTo 方法中的“伪造”行。我需要的(好吧,不一定需要,但它会很好)是一种获得与第一个示例相同的结果的方法,这样如果转换失败,可以返回分配给反射对象的值,并且可以按照与第一个示例相同的方式进行识别。

编辑:

我完成了什么:

public static dynamic ConvertTo( this string input, Type type, out bool success )
{
dynamic result;

var converter = TypeDescriptor.GetConverter( type );
if ( converter != null )
{
try
{
result = converter.ConvertFromString( input );
success = true;
return result;
}
catch { /* swallow the exception */ }
}

result = type.IsValueType ? Activator.CreateInstance( type ) : null;
success = false;

return result;
}

并使用:

bool success;
string val = "2011-09-21 17:25";
dateTime = val.ConvertTo( typeof( DateTime ), out success );
if ( success )
doSomethingGood();

val = "foo";
dateTime = val.ConvertTo( typeof( DateTime ), out success );
if ( !success )
dealWithBadData();

请记住,出于演示目的,我对 typeof() 位进行了硬编码。在我的应用程序中,类型都得到了体现。

感谢大家的快速回答!

最佳答案

你可以使用

//to get default(T) from an instance of Type
type.IsValueType ? Activator.CreateInstance(type) : null;

这是因为值类型保证有一个默认构造函数,而引用类型的默认值是一个null

关于c# - 反射(reflect)类型的默认值(T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508505/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com