6

考虑以下代码:

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

我试图在 a 中保留一个泛型类的实例以property供以后使用,但如您所知:

属性、事件、构造函数等不能是通用的——只有方法和类型可以是通用的。大多数时候这不是问题,但我同意有时这很痛苦(Jon Skeet

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

4

2 回答 2

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

当添加泛型时,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);
}

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

于 2013-07-26T22:01:48.243 回答
0

在这种情况下,您的类型本身必须是通用的。

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

但我不明白这门课的目的。GridConfig 方法具有设置 DataGrid 属性(具有私有设置器)的不明显副作用。如果我使用这个类,我永远不会猜到 GridConfig() 返回给我的值也被设置为 DataGrid 属性。换句话说:

var configurator = new GridConfigurator();
var firstGrid = configurator.GridConfig();
var firstReference = configurator.DataGrid;
var secondGrid = configurator.GridConfig();
var secondReference = configurator.DataGrid;

我会假设以下将返回false:

object.ReferenceEquals(firstGrid, secondGrid);

但我认为这将返回true

object.ReferenceEquals(firstReference, secondReference);

因为在上面的代码中,我从来没有分配过 DataGrid 属性。目前尚不清楚名为 GridConfig() 的方法是否会产生这种效果。

使封闭类型(GridConfigurator)也通用似乎违背了您尝试的目的。当他们可以直接使用对 DataGridForm 的直接引用时,为什么有人会使用这种类型呢?

如果 GridConfig 方法应该做的不仅仅是分配一个新的 DataGridForm 的默认实例,那么让它成为一个静态工厂类,如下所示:

static class GridConfigurator
{
  public static DataGridForm<TData,TGrid> GridConfig<TData, TGrid>(...) where TData: class
  {
    var grid = new DataGridForm<TData,TGrid>();
    // do something with the parameters to this method to initialize the instance.
     return grid;
  }
}

我还会将该方法命名为 GridConfig 以外的名称。像 Configure() 或 Create()。

于 2013-07-31T01:40:00.780 回答