zoukankan      html  css  js  c++  java
  • Effective C# 学习笔记(三十九) 使用Dynamic处理范型参数的运行时类型

    由于Enumerable.Cast<T>方法,其对T类型所知范围仅限于Sytem.Object类型的那些方法,所以对于T类型的特殊类型转换方法(无论是Implicit还是Explicit的)其都不会理睬。所以在使用运行时类型枚举转换时请注意使用适当的方法。

     

    先看一段代码:

    public class MyType

    {

    public String StringMember { get; set; }

     

    //隐式转换为String类型的定义

    public static implicit operator String(MyType aString)

    {

    return aString.StringMember;

    }

     

    //String类型转换为MyType类型的定义

    public static implicit operator MyType(String aString)

    {

    return new MyType { StringMember = aString };

    }

    }

    var answer1 = GetSomeStrings().Cast<MyType>();

    try

    {

    foreach (var v in answer1)

    Console.WriteLine(v);

    }

    catch (InvalidCastException)

    {

    Console.WriteLine("Cast Failed!");

    }

     

    上面的代码会抛出InvalidCastException异常,因为Cast<T>方法并不认识MyType的那些隐式类型转换转换方法,所以自然抛出异常。

     

    var answer3 = from v in GetSomeStrings()

    select (MyType)v;

    foreach (var v in answer3)

    Console.WriteLine(v);

     

    上面的代码可以成功,因为其使用了Reference conversion类型转换。

     

    有两种转换可以使隐式或显示类型转换起作用:

    Reference conversion :当 is 操作成功时

    Boxing conversion:装箱操作,将值类型转换为引用类型

     

    你也可以这样写:

    var answer4 = GetSomeStrings().Select(n => new MyType { StringMember = n });

    var answer5 = from v in GetSomeStrings()

           select new MyType { StringMember = v };

     

    这样的话你可能需要为每一个集合枚举的遍历进行类型转换,其实大可不必。我们可以写一个通用的Convert<T>扩展方法,其实现逻辑如下:

    public static IEnumerable<TResult> Convert<TResult>( this System.Collections.IEnumerable sequence)

    {

    foreach (object item in sequence)

    {

    dynamic coercion = (dynamic)item;

    yield return (TResult)coercion;

    }

    }

    在使用的时候我们可以这样:

    var convertedSequence = GetSomeStrings().Convert<MyType>();

  • 相关阅读:
    SDN实验2:Mininet 实验——拓扑的命令脚本生成
    2020软工实践第一次作业
    POJ2942-Knights of the Round Table
    POJ1966 ZOJ2182<无向图点连通度 Isap版>
    POJ1523(求割点)
    POJ2391(最大流Isap+Floyd+二分)
    POJ1087 ZOJ1157(最大流Isap+map映射)
    POJ1459(最大流Isap)
    数字的字符串处理 (转)
    POJ2112 最大流(Isap+Floyd+二分)
  • 原文地址:https://www.cnblogs.com/haokaibo/p/2121379.html
Copyright © 2011-2022 走看看