如何在 C# 中在运行时转换泛型值?

How do I cast a generic value at runtime in C#?

我有一个通用结构,类似于

public struct Range<T>

并且有两个属性,FromTo,类型为 T

该结构还有一个成员,如:

public bool FromGreaterTo
{
    get { return (bool)Comparer<T>.Default.Compare(From, To) > 0 };
}

我为这个结构的属性创建了一个ValidationAttribute

IsValid 方法的重写中,我知道它是类型 Range<>T is int? 或其他类型。

如何动态转换 value 参数(实际上是 Range<> 属性)以便访问 FromGreaterTo 成员?

我已经尝试过

private Range<T> Cast<T> (object valueToCast, T genericType)
{
    return (Range<T>)valueToCast;
}

其中抛出异常,表示此转换无效。

对此有什么想法或解决方法吗?

让Range成为class并给它一个抽象基数class.

public abstract class Range
{
    public abstract bool FromGreaterTo { get; }
}

public class Range<T> : Range
{
    // existing Range<T> code
}

然后您可以将 Range<T> 对象转换为 Range 对象并调用其 FromGreaterTo 属性.