c#中的静态派生类型

本文关键字:派生 类型 静态 | 更新日期: 2023-09-27 18:19:09

我正在寻找一个c#替代c++类型或特征类在特定情况下。我知道没有直接的对等物,但是对于这个特定的问题,也许有一些替代的解决方案?

这就是我要做的。我正在编写一个框架,其中有三种相关类型。一个视图,一个后备存储和一个工厂。这三个接口将有多个实现。视图和工厂之间是1-1关系,视图和存储之间是1-N关系。具体的暗示。这个框架看起来像这样:

Storage : IStorage<int> ...
View : IView<Storage> ... // And IView<T> : IViewNonGeneric further up..
Factory : IFactory<Storage> {
  // This needs to take a concrete storage type as arg
  IViewNonGeneric CreateView(Storage s) ... 
  Storage CreateStorage() ...  
}

View类是框架用户最重要的类;其他是实现细节。因此,根据View类(而不是根据Storage类)定义Factory似乎更自然。在c++中,这将是直接的,只需向视图添加一个类型定义并在工厂中使用它,如下所示:

class IView<typename T> { typedef T TStorage; ...
class IFactory<typename T> { 
  IViewNonGeneric CreateView(typename T::TStorage s) ... 
在c#中,我们显然没有类型定义或特征类。还有其他方法可以达到预期的效果吗?也就是说,是否可以使用View作为Factory的泛型参数,并从View派生出具体的Source类型?

c#中的静态派生类型

c#中的泛型肯定没有c++中的模板强大。然而,c#有一些c++没有的非常强大的东西:反射。

在视图类上定义一个返回存储类具体类型的方法(静态或实例)应该是非常容易的。然后你可以使用Type。GetConstructor动态查找存储类的构造函数,并使用ConstructorInfo调用它。调用方法。

此外,您可以探索可以分配给视图类的自定义属性的使用。不如这样写:

[StorageType( typeof( MyStorage1 ) ]
class MyView1 { ... }

然后在typeof(MyView1)上使用反射来查看它是否与StorageTypeAttribute相关联

我想这就是你想要的:

public interface IStorage<T>
{
}
public class IntStorage : IStorage<int>
{
}
public interface IFactory<S, T> where S : IStorage<T>
{
    IView<S, T> CreateView(S storage);
}
public interface IViewNonGeneric
{
}
public interface IView<S, T> : IViewNonGeneric where S : IStorage<T>
{
}
public class IntView : IView<IntStorage, int>
{
}
public class IntFactory : IFactory<IntStorage, int>
{
    public IntView CreateView(IntStorage storage)
    {
        // create the view
    }
    // private interface implementation
    IView<IntStorage, int> IFactory<IntStorage, int>.CreateView(IntStorage storage)
    {
        return CreateView(storage);
    }
}
...