gpt4 book ai didi

C# 可插拔工厂/静态初始化

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:48 25 4
gpt4 key购买 nike

我正在寻找与我的可插拔工厂代码等效的 C#。链接方法的优点是静态初始化会导致推送操作,其中每个插件都将自己添加到工厂。

可插拔工厂的 C++ 代码:( http://codepad.org/7pgzaaAK )

// base class for plugins
class Foo{
public:
virtual std::string getName()const=0;
virtual void exercise()const=0;
};

// plugin factory
class FooFactory{
public:
static Foo* GetA(std::string s);
typedef std::map<std::string,Foo*(*)(void)> mapType;
static mapType& getA();
};

FooFactory::mapType& FooFactory::getA(){static mapType getA;return getA;}
Foo* FooFactory::GetA(std::string s)
{return getA().find(s)!=getA().end()?getA()[s]():0;} // to simplify access

// helper function to add the fun
template<typename T>
Foo* getNew(){ return new T; }

// use the CRTP to automatically register the object with the factory.
template <typename T> struct Reg { Reg() { /*cout << "registering a " << T().getName( <<endl;*/
FooFactory::getA().insert(std::pair<std::string, Foo*(*)()>(T().getName(), &getNew<T>));} };

template <typename T>
class Foo_reg:public Foo{
public:
Foo_reg(){&reg;}; // using a reff to the static is enough to force initialization of the static earlier
static Reg<T> reg;
};
template <typename T> Reg<T> Foo_reg<T>::reg;

/////////////////
class FooBar:public Foo_reg<FooBar>{ // automatic registration with the factory
public:
FooBar(){a=10;}
virtual std::string getName()const{return "Foo Bar";}
virtual void exercise()const {cout <<a;}
private:
int a;
};

// exercise the factory and objects.
int main(){
Foo* foo=FooFactory::GetA("Foo Bar");
foo->exercise();
}

在 C# 中我可以看到两种方法,它们都是拉取操作

  1. 有一个明确的所有插件的预构建列表,必须与插件本身分开维护。

  2. 使用代码反射遍历所有类型,检查它们是否可转换为 Foo 并在任何 dll 加载和程序启动时初始化它们的静态。

有没有可能不用这些方法就可以做到这一点?

最佳答案

我不会太担心反射。即使是 PEX 也可以毫无问题地使用它。简单地说,通过反射,你只是检查一个程序集的元数据,看看它是否定义了任何实现某个接口(interface)或标记有某个属性的类,这非常快!无论如何,CLR 永远不会运行未被显式调用的代码,所以不,你必须求助于某种拉动机制(即使你让它看起来像推机制)

关于C# 可插拔工厂/静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9124744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com