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

时间:2009-11-29 12:49:11

标签: c# .net casting

我有一个泛型类,我想强制执行type参数的实例总是从String中“cast-able”/ convertible。是否可以在没有例如使用接口的情况下执行此操作?

可能的实施:

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实现IConvertibleFrom&lt;&gt;。

3 个答案:

答案 0 :(得分:3)

鉴于您要从密封的String类型转换,您可以忽略可能的可空,装箱,引用和显式转换。只有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 });
    }

注意反思的代价。

答案 1 :(得分:-1)

为什么你不能做这样的事情?

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

通过这种方式,您可以检查s代码中T是否可转换为DoSomethingWith。从那里你可以抛出异常,如果它不能,或者如果它可以

进行投射

答案 2 :(得分:-1)

if(!typeof(T).IsAssignableFrom(typeof(String))) {
    throw new Exception();
}