我有一个泛型类,我想强制执行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;。
答案 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();
}