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

时间:2015-02-11 14:47:20

标签: c# generics struct

我有一个类似于

的通用结构
public struct Range<T>

并且有From类型的ToT两个属性。

该结构也有一个成员:

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;
}

抛出异常,此演员表无效。

有关于此的任何想法或解决方法吗?

1 个答案:

答案 0 :(得分:3)

使Range成为一个类并为其提供一个抽象基类。

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

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

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