我有一个输入字符串,例如
"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>()
??它似乎非常方便动态类型所以我猜它在那里,我不想添加已经存在的代码
答案 0 :(得分:2)
您可能正在寻找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;
答案 1 :(得分:2)
不,没有内置方法可以像扩展方法一样工作。我认为框架设计者希望人们知道必须执行显式操作来将字符串解析为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
有关详细信息,请参阅this answer。
我应该指出:
.AsType()
方法将object
作为参数,则此方法才有意义。问题在于string
,s.AsType<int>()
优先于int.Parse(s)
?dynamic
值上使用扩展方法语法,因此如果不将d.a
强制转换为字符串值,问题中提供的代码将无法正常工作。