gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:48:49 26 4
gpt4 key购买 nike

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

可能的实现:

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();
}
// ...
}
}

我之所以更喜欢这个“理想”的实现,主要是为了不强制所有的T都实现IConvertibleFrom<>。

最佳答案

鉴于您要从密封的 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 });
}

注意反射的代价。

关于c# - 如何检查是否存在隐式或显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com