Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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"; }
}

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

Type myStaticClassType = Type.GetType("MyStaticClassNameSpace",true);
object[] myStaticMethodArguments = {object1,object2...};
MethodInfo myStaticMethodInfo = myStaticClassType.GetMethod("YourMethod");
var myStaticMethodResult = myStaticMethodInfo.Invoke(null,myStaticMethodArguments);

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

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

Spring.NET имеет приятную IResource абстракцию.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top