簡體   English   中英

在C#中從另一個類獲取一個類的公共變量的值

[英]Get the value of public variable of one class from another class in C#

我有一個 C# 應用程序,它的邏輯類似於以下內容:

public ClassA {
    public string myID { get; set; }

    public void SetID(string jobID)
    {
        myID = jobID;    
    }

    public void SomeMethod(){
        ClassB b = new ClassB();
        LogMessage("Execution starts here");
        b.FetchData();
        LogMessage("Further execution");

    }
    public void LogMessage (string message){

        //some logic to write message into a text file with the following message :

        // "Id : " + myID + " --> " + message
    // next line (enter)
    }
}

public class ClassB(){

    public void FetchData(){
        ClassA a = new ClassA();
        a.LogMessage("Fetch data starts");
        //some logic to fetch data
        a.LogMessage("Fetch data ends");
    }

}

如果 id 值為“ABC”,則執行此操作后的文本文件如下所示:

Id : ABC --> Execution starts here
Id : (null) --> Fetch data starts
Id : (null) --> Fetch data ends
Id : ABC --> Further execution

我在這里面臨的問題是,即使它是一個公共變量,id 也沒有被打印出來。 當執行進入另一個類時, myId變量變為空。 同樣由於某些原因,我無法將myId變量作為參數傳遞給LogMessage()

始終獲取 myId 值而不從所有方法中將其設為 null 的簡單方法是什么? 上面的代碼只是我的應用程序中的示例。 這種類似的日志記錄在很多方法中完成。 這將在LogMessage()

LE:我看到您更正了變量錯字,現在我看到了問題所在。

在 ClassB 中,您再次實例化 ClassA,其中包含 LogMessage 但您不調用 SetID(因此 myID 為空)。

LE2:我不會在這些類中的任何一個中使用 log 方法,因為SOLID原則中的 S 聲明(一個類需要有一個單一的責任)。 您可以采用的一種方法是創建一個靜態類來處理日志記錄邏輯:

public static class Logger
{
    private static string myID;

    public static SetMyId(string id)
    {
        myID = id;
    }

    public static void Log(string message)
    {
        //print myID _+ message
    }
}

只要應用程序處於活動狀態,靜態變量就會保留您的 ID。 當然,這里有專門的模式,所以根據你的上下文,根據你的需要探索不同的其他選項可能是好的(我在一個簡單的谷歌搜索中找到的一個例子)以及為你做日志記錄的庫( 這里有一些例子)

類變量,也稱為字段,存在於每個類實例中(這里我不是在談論靜態字段)。 即,每個對象都有自己的一組字段值。

ClassB ,您使用ClassA a = new ClassA();創建一個新對象ClassA a = new ClassA(); . 這與您調用SomeMethod對象SomeMethod

您可以通過構造函數注入將ClassA對象傳遞給ClassB 更改ClassB

public class ClassB()
{
    private readonly ClassA _a;

    // Constructor. You call it with `new ClassB(classAObject)`.
    public ClassB(ClassA a)
    {
        _a = a;
    }

    public void FetchData(){
        _a.LogMessage("Fetch data starts");
        // Fetching data here...
        _a.LogMessage("Fetch data ends");
    }
}

ClassA SomeMethod更改為

public void SomeMethod()
{
    myID = "ABC";

    // Pass a reference to the current object (this).
    ClassB b = new ClassB(this);

    LogMessage("Execution starts here");
    b.FetchData();
    LogMessage("Further execution");
}

此外,創建方法SetID也沒有意義,因為myID屬性已經有一個公共設置器。

您需要將字符串添加到日志消息中,因為您將傳入一個名為 message 的變量,該變量應該是一個字符串?

public void LogMessage (string message){

        //some logic to write message into a text file with the following message :

        // "Id : " + myID + " --> " + message
    // next line (enter)
    }

在類 B 中,沒有指向您創建的類 a 實例的引用指針。 所以我不確定你是如何調用這個方法的。

添加

public class ClassB(){

    ClassA NewMessage = new ClassA();

    public void FetchData(){

        NewMessage.LogMessage("Fetch data starts");
        //some logic to fetch data
        NewMessage.LogMessage("Fetch data ends");
    }

}

只是先介紹一下如何解耦:“快速且非常臟”:

public class Logger {
    public void LogMessage (string message, string myID){

        //some logic to write message into a text file with the following message :

        // "Id : " + myID + " --> " + message
    // next line (enter)
    }
}

public ClassA {
    private Logger logger = new Logger();

    public string myID { get; set; }

    // SetID is actually not necessary: just use classAInstance.myID = jobID; in the client of ClassA.
    // But I'd recommend making the Property Readonly and set it through CTOR if possible.


    public void SomeMethod(){
        ClassB b = new ClassB();
        logger.LogMessage("Execution starts here", myID);
        b.FetchData(logger, myID);
        logger.LogMessage("Further execution", myID);

    }

}

public class ClassB(){

    public void FetchData( Logger logger, string myID){

        logger.LogMessage("Fetch data starts", myID);
        //some logic to fetch data
        logger.LogMessage("Fetch data ends", myID);
    }
}

可以通過以下方式進一步改進:

  • 使用 Logger 的接口
  • 使用日志框架
  • 使用依賴注入
  • 通過使用接口和 DI 將 ClassB 與 ClassA 解耦。
  • ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM