日期:2014-05-19  浏览次数:20932 次

[請教]如何在運行時獲取一個類型的實例(反射﹑設計模式)
在不使用單件模式和靜態類的情況下﹐在運行時獲取一個已創建的實例對象?

比如有一個Startup類型﹐
現在有

Startup   startup   =   new   Startup();

如果在其他的類型中獲取到這個已實例化的startup對象?

------解决方案--------------------
如果在其他的類型中獲取到這個已實例化的startup對象?
--------------------------------------
获取实例就是需要获取实例的引用
在你代码的上下文中必须能获得该实例的引用,比如该实例在上下文中创建(类似单件),或全局变量(静态类),更复杂的aop似的代码拦截获取上下文
------解决方案--------------------
这关反射什么事?

要拿到这个对象要确保两点:
1、能拿到它的引用
2、它没被销毁

实际上只要满足了条件1,这个对象的引用还可以被活动代码访问到,那么它就不会被销毁。

所以你只要把这个对象放到一个你想要拿的地方就可以了。
我相信你的脑子一定能想出一个比单件和静态类更好的地方的,楼主……
------解决方案--------------------
using System;

namespace TEST
{
/// <summary>
/// Class 的摘要说明。
/// </summary>
public class 其他的類型
{
public Startup _startup;

public 其他的類型()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public void 获取已實例化的對象(Startup objStartup)
{
_startup=objStartup;//创建一个函数成员来传递已存在的实体
}
}
}
------解决方案--------------------
传递对象的引用..
------解决方案--------------------
这个没有别的办法,因为你不引用一个对象之后,这个对象就有可能被垃圾回收点,

在设计模式中有个叫 注册模式的

其实就是把你这个对象放到一个dict或者hashtable里面,然后通过名字找。

比如
dict dic;
regist(obj){
dict.add(obj.GetType().toString(),obj)
}
getobj(str){
return dic.get(str);
}
然后就可以通过str来获得你要的对象了
------解决方案--------------------
要单件实例就不要这样弄: Startup startup = new Startup();

参考下面写 Startup 类:

public class Startup
{
private static Startup _Startup;
private Startup(){}

public static Startup GetStartup()
{
if (_Startup==null) _Startup=new Startup();
return _Startup;
}
}

以后每个要用的地方只要 Startup.GetStartup(); //就始终都是一个实例