2009-12-22 159 views
0

我正在用C#編寫一個類庫(API)。該類是非靜態的幷包含多個公共事件。是否有可能從一個單獨的類中的靜態方法觸發這些事件? 例如...從靜態類觸發非靜態類?

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(); 

    } 
} 

我知道你通常要訪問它的方法,但在這種情況下,一個實例已經創建,只是沒有通過類來創建非靜態類的實例即試圖訪問它。

回答

3

實例方法只能在實例調用。在你的例子中,實例正在調用靜態方法。你可以給靜態方法一個參數,允許實例傳遞給自己的引用嗎?事情是這樣的:

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(); 

    } 
} 

我想你需要澄清你的問題,指定爲什麼你不能做這樣的事情,爲什麼實例不能提高自己的事件。

+0

這使得一噸的感覺。我認爲我的大腦不能正常工作! – PICyourBrain 2009-12-22 17:35:39

4

不,實例成員只能在該類型的有效實例上調用/訪問。

爲了達到此目的,您必須將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); 
    } 
}