gpt4 book ai didi

c# - TypeConverter 日期时间格式问题

转载 作者:行者123 更新时间:2023-11-30 12:10:42 24 4
gpt4 key购买 nike

我正在使用 4.0,我正在尝试通过开发一些用于类型转换的辅助方法来让我的生活更轻松。以下方法运行良好。它将从任何字符串转换为其他数据类型。

System.ComponentModel;

public static T Convert<T>(string s)
{
var typeConverter = TypeDescriptor.GetConverter(typeof(T));
if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
return (T)typeConverter.ConvertFrom(s);
}
return default(T);
}

//calling this method...
var dateTime = MyConverter.Convert<DateTime>("13/07/2013"); // Date format "DD/mm/yyyy"
// Working as expected... Taking "13" as Day, "07" as month

现在以下方法也在同一个类 MyConverter 中,但它不适用于 DateTime:

public static bool CanConvertTo<T>(string s)
{
var typeConverter = TypeDescriptor.GetConverter(typeof(T));

if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
return typeConverter.IsValid(s);
}
else
return false;
}

这个方法的问题是,它只接受日期格式:“MM/dd/yyyy”

// This will give exception. It is taking "13" as month, "07" as Day
bool canConvert = MyConverter.CanConvertTo<DateTime>("13/07/2013");

编辑根据 KeyboardP 的建议,我将方法更改为:

public static bool CanConvertTo<T>(string s)
{
TypeConverter typeConverter;
if (typeof(T) == typeof(DateTime))
{
typeConverter = new DateTimeConverter();
}
else
{
typeConverter = TypeDescriptor.GetConverter(typeof(T));
}

if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
return typeConverter.IsValid(s);
}
else
return false;
}

并进行了测试。测试结果是:

var date = MyConverter.Convert<DateTime>("13/07/2013");    //return perfect date
var canConvert = MyConverter.CanConvertTo<DateTime>("13/07/2013"); // returned false...

所以 DateTimeConverter 没有成功

最佳答案

由于 DateTime 可以有许多不同的格式样式,我只使用 DateTimeConverter而不是尝试在通用方法中重新创建它。

编辑

我做了一些 ILspying,这是我得出的结论(很高兴在任何一点上得到纠正)。

GetCoverter(typeof(DateTime)) 将返回一个 DateTimeConverter 所以调用 CanConvertFrom 实际上是调用 DateTimeConverter.CanConvertFromCanConvertFrom 调用 base.CanConvertFrom(base 是父 TypeConverter 类)。

base.CanConvertFrom 方法如下所示

public virtual bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(InstanceDescriptor);
}

由于 DateTime.GetType() != typeof(InstanceDescriptor),返回值为 falseCanConvertFromIsValid 方法调用,因为我们刚刚确定返回值为 falseIsValid 返回错误

那么,即使调用了相同的 CanConvertFrom 方法,Convert 方法又是如何工作的呢?

好吧,您传递的参数是 string 类型,而不是 DateTime

typeConverter.CanConvertFrom(typeof(string))

在上面的第一个代码片段中,CanConvertFrom 方法用于 TypeConverter 基类。如果我们查看 DateTimeConverter.CanConvertFrom 覆盖,它看起来像这样

public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
}

由于我们将 String 作为类型传递,因此此方法返回 true(与 IsValid 调用不同)。因为这个返回true,所以代码继续调用

return (T)typeConverter.ConvertFrom(s);

(其中 T 是一个 DateTime)

DateTimeConverter 只是调用 DateTime.Parse 并忽略区域性。我不确定这是设计使然还是错误,但我不会依赖 DateTime.Parse 除非您知道字符串始终具有相同的格式(或者您在调用之前正确格式化它方法)。

关于c# - TypeConverter 日期时间格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17468111/

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