泛型方法将Type作为Type参数返回
本文关键字:Type 返回 参数 作为 泛型方法 | 更新日期: 2023-09-27 18:24:23
我有一个扩展方法,它可以将字符串值转换为各种类型,看起来像这样:
public static T ToType<T> (this string value, T property)
{
object parsedValue = default(T);
Type type = property.GetType();
try
{
parsedValue = Convert.ChangeType(value, type);
}
catch (ArgumentException e)
{
parsedValue = null;
}
return (T)parsedValue;
}
然而,我对调用该方法时的样子感到不满:
myObject.someProperty = stringData.ToType(myObject.someProperty);
指定属性只是为了获取属性的类型似乎是多余的。我宁愿使用这样的签名:
public static T ToType<T> (this string value, Type type) { ... }
并使T最终成为类型的类型。这将使通话更加干净:
myObject.someProperty = stringData.ToType(typeof(decimal));
然而,当我尝试以这种方式调用时,编辑器抱怨扩展方法的返回类型无法从用法中推断出来。我可以将T链接到Type参数吗?
我错过了什么?
感谢
这就是您想要的吗?我为演员阵容无效的情况添加了一个额外的陷阱,也是
Decimal i = stringName.ToType<Decimal>();
public static T ToType<T>(this string value)
{
object parsedValue = default(T);
try
{
parsedValue = Convert.ChangeType(value, typeof(T));
}
catch (InvalidCastException)
{
parsedValue = null;
}
catch (ArgumentException)
{
parsedValue = null;
}
return (T)parsedValue;
}
编辑
修复Anton评论的快捷方法
if (typeof(T).IsValueType)
return default(T);
为什么要使用属性?只需更改将类型变量设置为泛型类型的方式。
public static T ToType<T>(this string value)
{
object parsedValue = default(T);
Type type = typeof(T);
try
{
parsedValue = Convert.ChangeType(value, type);
}
catch (ArgumentException e)
{
parsedValue = null;
}
return (T) parsedValue;
}
用法:
myObject.someProperty = stringData.ToType<decimal>()
我正在使用它进行通用转换:
public bool ConvertTo<T>(object from, out T to) {
to = default(T);
if (from is T) { to = (T)from; return true; }
Type t = typeof(T);
//TypeConverter converter = p.converter == null ? TypeDescriptor.GetConverter(t) : p.converter;
TypeConverter converter = TypeDescriptor.GetConverter(t);
if ((converter != null) && (converter.CanConvertTo(t))) {
try { to = (T)converter.ConvertTo(null, culture, from, t); return true; }
catch { }
}
try { to = (T)Convert.ChangeType(from, t, culture); return true; }
catch { }
return false;
}
public bool ConvertTo(object from, out object to, Type type) {
to = null;
if (from.GetType() == type) { to = from; return true; }
TypeConverter converter = TypeDescriptor.GetConverter(type);
if ((converter != null) && (converter.CanConvertTo(type))) {
try { to = converter.ConvertTo(null, culture, from, type); return true; }
catch { }
}
try { to = Convert.ChangeType(from, type, culture); return true; }
catch { }
return false;
}
在调用Convert.ChangeType
之前,这将检查给定变量是否存在TypeConverter
。
这样说吧:
int i = 123;
string s;
if (ConvertTo<string>(i, out s) {
// use s
}