任何内置对象.AsType<;T>;
本文关键字:gt 内置 lt AsType 任何 对象 | 更新日期: 2023-09-27 18:28:29
我有一个输入字符串,比如
"x=y|a=b|c=10" etc
它被转换为动态,我用它作为
dynamic d = getDynamicFromStringAbove();
someFunc( d.a.AsType<int>() )
其中AsType是定义为的扩展方法
public static T AsType<T>(this string o){
return (T) Convert.ChangeType(o, typeof(T));
}
问题-框架中有什么东西可以提供这个已经存在的吗
object.AsType<T>()
它对动态类型来说似乎很方便,所以我猜它就在那里,我不想添加已经存在的代码
不,没有像您的扩展方法那样工作的内置方法。我认为框架设计者希望人们知道,必须执行显式操作才能将字符串解析为int等。
顺便说一句,我可以建议您将AsType
方法改为使用TypeConverter
而不是Convert.ChangeType
吗?它更加强大和灵活。例如,它可以更好地将枚举值转换为它们各自的类型。
public enum Foo {A,B,C}
...
TypeDescriptor.GetConverter(typeof(Foo)).ConvertFrom("A"); // Yields Foo.A
Convert.ChangeType("A", typeof(Foo)); // Throws exception
有关详细信息,请参阅此答案。
更新
我应该指出:
- 只有当
.AsType()
方法将object
作为其参数时,这种方法才真正有意义。就目前的情况来看,你正在服用string
,s.AsType<int>()
在什么方面比int.Parse(s)
更可取 - 由于不能对
dynamic
值使用扩展方法语法,因此如果不将d.a
强制转换为字符串值,问题中提供的代码实际上就无法工作
您可能正在查找as
关键字,尽管它仅适用于引用类型。
你会写一个这样的表达式:
var instanceOfT = a as T;
如果a
可以转换为T
,那么它将包含该类型的有效强类型引用。否则,a
将是null
引用。
关于as
可以做什么和不能做什么的进一步示例。。。
dynamic d;
d = "test!";
// this will work and get a valid String reference
var stringInstance = d as String;
d = 1;
// next line generates a compiler error as Int32 (int) isn't a reference type
var integerInstance = d as Int32;
// and this compiles, but results in a null reference as d isn't a String anymore
var anotherString = d as String;