c#按字符串访问对象实例

时间:2012-08-31 06:32:06

标签: c# reflection

我有一个像这样的静态类:

public static class MyApp
{
    public static volatile MultiThreadLogger Logger = new MultiThreadLogger();
}

这样的字符串:

"MyApp.Logger"

如何在知道字符串的情况下获取对象引用?字符串可以与"MyOtherNamespace.Subnamespace.StaticObjA.MemberIwantToAccess"不同,我不想创建新实例,我想访问静态实例 - 只需要字符串。

可能的?

3 个答案:

答案 0 :(得分:3)

Type t = Type.GetType("MyApp");
PropertyInfo p = t.GetProperty("Logger", Reflection.BindingFlags.Public | Reflection.BindingFlags.Static | Reflection.BindingFlags.FlattenHierarchy);
return p.GetValue(null, null);

http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

How to get a Static property with Reflection

答案 1 :(得分:2)

public class ClassFactory
{
    static Dictionary<string, object> _Instances;

    public static object Get(string type)
    {
        lock (_Instances)
        {
            object inst;
            if (_Instances.TryGetValue(type, out inst)) return inst;

            inst = Activator.CreateInstance(Type.GetType(type));
            _Instances.Add(type, inst);

            return inst;
        }
    }
}

答案 2 :(得分:0)

你正在寻找一个特定的课程吗?在这种情况下,您可以添加一个属性,然后使用反射,MEF或类似的东西在一个assemlby中迭代定义的类,直到找到合适的类。

如果您正在寻找一个对象(该类的一个实例),您需要在某种工厂中“注册”它,可能是静态字典,然后从那里加载它。

更好的解决方案是考虑IoC容器(http://en.wikipedia.org/wiki/Inversion_of_control)。 IoC容器将处理生命周期管理并返回不同版本以进行测试或应用程序的不同部分。可以在http://weblogs.asp.net/sfeldman/archive/2008/02/14/understanding-ioc-container.aspx找到对它们的一个很好的解释,然后在http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx找到一个清单。