使用动态类型而不是不可能的通用属性

sab*_*ber 6 .net c# generics dynamic

请考虑以下代码:

    public dynamic DataGrid { get; private set; }
    public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() where TData : class
    {
        return DataGrid = new DataGridForm<TData, TGrid>();
    }
Run Code Online (Sandbox Code Playgroud)

我正在尝试将一个泛型类的实例保留在propertyfor 以供以后使用,但如您所知:

属性,事件,构造函数等不能是通用的 - 只有方法和类型可以是通用的.大部分时间都不是问题,但我同意有时这很痛苦(Jon Skeet)

我想知道这是解决这种情况的好方法吗?

luk*_*itt 1

正如评论中的答案所示,您可以使用基类或接口来执行此操作:

class DataGridForm {}
class DataGridForm<TData, TGrid> : DataGridForm {}

class GridConfigurator
{
    public DataGridForm DataGrid { get; private set; }
    public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() where TData : class
    {
        return DataGrid = new DataGridForm<TData, TGrid>();
    }
}
Run Code Online (Sandbox Code Playgroud)

当添加泛型时,C# 中的大量类型和接口都以这种方式进行了扩展。但是,我可能会重新评估您的设计,以便可能称为 GridConfig() 的任何内容都在缓存 DataGridForm,因为它知道类型。例如,我在代码中做了非常类似的事情:

class Vector<T> { ... }
static class Vector
{
    public static Vector<T> Create<T>(T value)
    {
        return new Vector<T>(value);
    }
}

class OtherClass
{
    public static Vector<int> MyVector = Vector.Create(1);
}
Run Code Online (Sandbox Code Playgroud)

不过,您的具体用例可能不支持这种风格。