Активатор и статические классы - PullRequest
12 голосов
/ 05 марта 2009

Я отказываюсь от идеи использования класса Activator для получения доступа к ресурсам в сборке, для которой в противном случае я бы создал циклическую ссылку (внедрение зависимости). Я делал это раньше с ванильными классами, на которые мне требовалась ссылка, но мой вопрос: могу ли я использовать Activator для получения доступа к статическому классу?

Меня сбивает с толку то, что Активатор возвращает вам экземпляр объекта, тогда как статический класс не имеет экземпляра. Возможно ли это?

Ответы [ 5 ]

22 голосов
/ 05 марта 2009

Вам не нужен Активатор для вызова метода. Вы используете MethodInfo.Invoke напрямую. Первый параметр можно оставить пустым.

16 голосов
/ 05 марта 2009

GvS является правильным - вот пример использования:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type type = Type.GetType("Foo");
        MethodInfo info = type.GetMethod("Bar");

        Console.WriteLine(info.Invoke(null, null));
    }
}

static class Foo
{
    public static String Bar() { return "Bar"; }
}
5 голосов
/ 19 февраля 2015

Еще один пример использования MethodInfo.Invoke

Type myStaticClassType = Type.GetType("MyStaticClassNameSpace",true);
object[] myStaticMethodArguments = {object1,object2...};
MethodInfo myStaticMethodInfo = myStaticClassType.GetMethod("YourMethod");
var myStaticMethodResult = myStaticMethodInfo.Invoke(null,myStaticMethodArguments);
0 голосов
/ 05 марта 2009

Если то, что вы подразумеваете под «ресурсами», на самом деле являются ресурсами, встроенными в сборку, вы всегда можете извлечь их вручную (см. Assembly.GetManifestResourceStream()), не используя статические классы (с ними будет больше проблем, так как единственный способ Вы можете использовать их чисто с отражением).

Spring.NET имеет хорошую IResource абстракцию.

И нет, Activator нельзя использовать для "создания" статических классов.

0 голосов
/ 05 марта 2009

Это не значит, что у статического класса нет экземпляра, просто у него нет открытых конструкторов. Активатор использует отражение для создания экземпляров, а когда вы используете отражение, вы можете вызывать что угодно, даже частные конструкторы

...