任何内置对象.AsType <t> </t>

时间:2012-03-20 18:10:16

标签: c# .net dynamic

我有一个输入字符串,例如

"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>()

??它似乎非常方便动态类型所以我猜它在那里,我不想添加已经存在的代码

2 个答案:

答案 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

更新

我应该指出:

  1. 如果您的.AsType()方法将object作为参数,则此方法才有意义。问题在于strings.AsType<int>()优先于int.Parse(s)
  2. 由于您无法在dynamic值上使用扩展方法语法,因此如果不将d.a强制转换为字符串值,问题中提供的代码将无法正常工作。