Запуск нестатического класса из статического класса? - PullRequest
0 голосов
/ 22 декабря 2009

Я пишу библиотеку классов (API) на C #. Класс не является статичным и содержит несколько открытых событий. Можно ли вызвать эти события из статического метода в отдельном классе? Например ...

class nonStaticDLLCLASS
{
   public event Event1;

   public CallStaticMethod()
  {
     StaticTestClass.GoStaticMethod();
  }
}

class StaticTestClass
{
   public static GoStaticMethod()
   {
     // Here I want to fire Event1 in the nonStaticDLLCLASS
     // I know the following line is not correct but can I do something like that?

     (nonStaticDLLCLASS)StaticTestClass.ObjectThatCalledMe.Event1();

   }
}

Я знаю, что вам обычно нужно создавать экземпляр нестатического класса для доступа к его методам, но в этом случае экземпляр уже создан, но не классом, который пытается получить к нему доступ.

Ответы [ 2 ]

4 голосов
/ 22 декабря 2009

Нет, элементы экземпляра могут быть вызваны / доступны только для действительного экземпляра типа.

Чтобы это работало, вы должны передать экземпляр nonStaticDLLCLASS в StaticTestClass.GoStaticMethod и использовать ссылку на этот экземпляр для вызова / доступа к нестатическим элементам.

В приведенном выше примере, как вы указываете, к какому экземпляру типа вы обращаетесь? Статический метод не знает ни одного экземпляра, так как он узнает, какой из них использовать, или если они вообще загружены в память?

Рассмотрим этот пример:

using System;

class Dog
{
    public String Name { get; set; }
}

class Example
{
    static void Main()
    {
        Dog rex = new Dog { Name="Rex" };
        Dog fluffy = new Dog { Name="Fluffy" };
    }
    static void sayHiToDog()
    {
        // In this static method how can I specify which dog instance
        // I mean to access without a valid instance?  It is impossible since
        // the static method knows nothing about the instances that have been
        // created in the static method above.
    }
    static void sayHiToDog(Dog dog)
    {
        // Now this method would work since I now have an instance of the 
        // Dog type that I can say hi to.
        Console.WriteLine("Hello, " + dog.Name);
    }
} 
3 голосов
/ 22 декабря 2009

Методы экземпляра могут быть вызваны только для экземпляров. В вашем примере экземпляр вызывает статический метод. Можете ли вы дать статическому методу параметр, позволяющий экземпляру передавать ссылку на себя? Примерно так:

class nonStaticDLLCLASS
{
   public event Event1;

   public CallStaticMethod()
  {
     StaticTestClass.GoStaticMethod(this);
  }
}

class StaticTestClass
{
   public static GoStaticMethod(nonStaticDLLCLASS instance)
   {
     // Here I want to fire Event1 in the nonStaticDLLCLASS
     // I know the following line is not correct but can I do something like that?

     instance.Event1();

   }
}

Я думаю, вам нужно уточнить свой вопрос, чтобы уточнить, почему вы не можете сделать что-то подобное или почему экземпляр не может вызвать собственное событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...