代码之家  ›  专栏  ›  技术社区  ›  Joaquim Rendeiro

如何检查隐式或显式强制转换是否存在?

  •  5
  • Joaquim Rendeiro  · 技术社区  · 15 年前

    我有一个泛型类,我想强制类型参数的实例始终是“可转换的”/可从字符串转换的。是否可以在不使用接口的情况下执行此操作?

    可能的实施:

    public class MyClass<T> where T : IConvertibleFrom<string>, new()
    {
        public T DoSomethingWith(string s)
        {
            // ...
        }
    }
    

    理想实现:

    public class MyClass<T>
    {
        public T DoSomethingWith(string s)
        {
            // CanBeConvertedFrom would return true if explicit or implicit cast exists
            if(!typeof(T).CanBeConvertedFrom(typeof(String))
            {
                throw new Exception();
            }
            // ...
        }
    }
    

    我之所以喜欢这种“理想”的实现,主要是为了不强制所有TS实现来自<>的IConvertible。

    3 回复  |  直到 11 年前
        1
  •  3
  •   Hans Passant    11 年前

    考虑到要从密封字符串类型转换,可以忽略可能的可空转换、装箱转换、引用转换和显式转换。只有 op_Implicit() 合格。System.Linq.Expressions.Expression类提供了更通用的方法:

    using System.Linq.Expressions;
    ...
        public static T DoSomethingWith(string s)
        {
          var expr = Expression.Constant(s);
          var convert = Expression.Convert(expr, typeof(T));
          return (T)convert.Method.Invoke(null, new object[] { s });
        }
    

    小心思考的代价。

        2
  •  -1
  •   Graviton    15 年前

    你为什么不能这样做?

    public class MyClass<T> where T : string
    {
        public T DoSomethingWith(string s)
        {
            // ...
        }
    }
    

    这样你就可以检查 s 可转换为 T DoSomethingWith 代码。如果不能的话,你可以抛出异常,如果可以的话,你也可以进行铸造。

        3
  •  -1
  •   David Hedlund    15 年前
    if(!typeof(T).IsAssignableFrom(typeof(String))) {
        throw new Exception();
    }