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++没有的非常强大的东西:反射。
在视图类上定义一个返回存储类具体类型的方法(静态或实例)应该是非常容易的。然后你可以使用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);
}
}
...