任何内置对象.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>()

它对动态类型来说似乎很方便,所以我猜它就在那里,我不想添加已经存在的代码

任何内置对象.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

有关详细信息,请参阅此答案。

更新

我应该指出:

  1. 只有当.AsType()方法将object作为其参数时,这种方法才真正有意义。就目前的情况来看,你正在服用strings.AsType<int>()在什么方面比int.Parse(s)更可取
  2. 由于不能对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;