[英]Generic Method Return Type as Type parameter
我有一個擴展方法,可以將字符串值轉換為各種類型,看起來像這樣:
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;
}
編輯
修復安東評論的捷徑
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.