1

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

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

还有这样的字符串:

"MyApp.Logger"

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

可能的?

4

3 回答 3

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

如何使用反射获取静态属性

于 2012-08-31T06:41:09.760 回答
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;
        }
    }
}
于 2012-08-31T06:38:14.197 回答
0

您在寻找特定的课程吗?在这种情况下,您可以添加一个属性,然后使用反射、MEF 或类似的方法在程序集中迭代定义的类,直到找到正确的类。

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

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

于 2012-08-31T06:41:22.940 回答