簡體   English   中英

無法使用第三方提供的類通過嵌套類型訪問外部類型XXX的非靜態成員

[英]Cannot access a non-static member of outer type XXX via nested type with a third-party provided class

總的來說,這個問題已在SOF中得到解決。 但是,我無法(不夠勝任)將建議應用於此示例。 我收到“無法通過嵌套類型訪問外部類型為'FixClientTest.Form1'的非靜態成員...”錯誤。 在這種情況下,嵌套類型是第三方提供的類的實例化(在這種情況下,為開源QuickFix / n庫)。 我知道來源並不真正相關,但是我試圖避免提出任何建議,這些建議可能會讓我修改該代碼並且不具備解決該問題的知識。 我的目標只是根據我從該庫的回調中獲取的信息來更新表單控件。 (下面的代碼只是一個簡單的表單,帶有2個按鈕,一個按鈕用於設置事件回調,另一個按鈕用於停止事件回調。)我將非常感謝社區可能提出的任何建議。

謝謝。

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using QuickFix;

namespace FixClientTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class MyQuickFixApp : QuickFix.IApplication
        {    
            public void FromApp(QuickFix.Message msg, SessionID sessionID) { }
            public void OnCreate(SessionID sessionID) { }
            public void OnLogout(SessionID sessionID) 
            {
                Console.WriteLine("Logged out.");
            }
            public void OnLogon(SessionID sessionID) 
            {
                Console.WriteLine("Logged In.");
            }
            public void FromAdmin(QuickFix.Message msg, SessionID sessionID) 
            {
                //logListView.Items.Add(msg.ToString()); <<GENERATES ERROR!

            }
            public void ToAdmin(QuickFix.Message msg, SessionID sessionID) { }
            public void ToApp(QuickFix.Message msg, SessionID sessionID) { }
        }

        public QuickFix.Transport.SocketInitiator _Initiator = null;

        private void connectButton_Click(object sender, EventArgs e)
        {
            string file = "c:/FIX/tradeclientIB.cfg";
            try
            {
                QuickFix.SessionSettings settings = new QuickFix.SessionSettings(file);
                QuickFix.IApplication myApp = new MyQuickFixApp();
                QuickFix.IMessageStoreFactory storeFactory = new QuickFix.FileStoreFactory(settings);
                QuickFix.ILogFactory logFactory = new QuickFix.ScreenLogFactory(settings);
                _Initiator = new QuickFix.Transport.SocketInitiator(myApp, storeFactory, settings, logFactory);   
                _Initiator.Start();

            }
            catch (System.Exception err)
            {
                MessageBox.Show(err.ToString());
            }
        }

        private void stopButton_Click(object sender, EventArgs e)
        {
            _Initiator.Stop();
        }
    }
}

您的MyQuickFixApp類對Form1對象一無所知。

首先,我建議將其移出Form1類。 然后,我將研究如何以及何時創建MyQuickFixApp對象。 我對QuickFix庫不熟悉,但是快速瀏覽一下文檔表明在按鈕消息處理程序中創建它不是正確的方法。 (在Winforms應用程序中,我想您會在Program.Main方法中創建它)。

至於實際的錯誤,您需要給MyQuickFixApp對象一個對Form1對象的引用(可能在構造函數中傳遞它)。

public class MyQuickFixApp : QuickFix.IApplication
{
    private readonly Form1 _form1;
    public MyQuickFixApp(Form1 form)
    {
       _form1 = form;
    }

    public void FromAdmin(QuickFix.Message msg, SessionID sessionID) 
    {
        _form1.logListView.Items.Add(msg.ToString());
    }
}

在等待答案的過程中,我再次查看了此鏈接中提供的答案: 財產由於其保護等級而無法訪問當我再次仔細閱讀它時,我意識到史蒂夫已經發布了我需要的答案,因此真的是他的答案。 我需要使用事件來重組它,以捕獲表單中的更改並保留封裝。 這也使我可以將更新了表單的類移出Form類,但是,這卻引起了人們普遍擔心的“跨線程”問題。 我已經從其他人那里得到了答案(對不起,沒有該鏈接)。 我向事件添加了行,以更新表單以將其拆分為新線程。 我以前做過,而且效果很好。 如果有人認為這可能是個問題,請告訴我。 抱歉,如果我浪費任何時間在看我的問題上,但是我想我會分享一些答案,因為它解決了自學習c#/ forms以來我遇到的兩個最大問題。

一件事,不要對這個聲明感到困惑: private delegate void AddLogItemDelegate(string msg); 它與創建包含AddLogItem函數的線程有關,與事件的創建無關。

謝謝

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using QuickFix;

namespace FixClientTest
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public QuickFix.Transport.SocketInitiator _Initiator = null;

        private void connectButton_Click(object sender, EventArgs e)
        {
            string file = "c:/FIX/tradeclientIB.cfg";
            try
            {
                QuickFix.SessionSettings settings = new QuickFix.SessionSettings(file);
                QuickFix.IApplication myApp = new MyQuickFixApp();
                QuickFix.IMessageStoreFactory storeFactory = new QuickFix.FileStoreFactory(settings);
                QuickFix.ILogFactory logFactory = new QuickFix.ScreenLogFactory(settings);
                //QuickFix.Transport.SocketInitiator initiator = new QuickFix.Transport.SocketInitiator(myApp, storeFactory, settings, logFactory);
                _Initiator = new QuickFix.Transport.SocketInitiator(myApp, storeFactory, settings, logFactory);

                MyQuickFixApp.UpdateEvent += new MyQuickFixApp.OnUpdateEvent(AddLogItem);
                _Initiator.Start();

            }
            catch (System.Exception err)
            {
                Console.WriteLine(err.Message);
                Console.WriteLine(err.StackTrace);
                MessageBox.Show(err.ToString());
            }
        }

        private void stopButton_Click(object sender, EventArgs e)
        {
            _Initiator.Stop();
        }
        public string stuff;

        private delegate void AddLogItemDelegate(string msg);
        public void AddLogItem(string msg)
        {
            if(this.InvokeRequired)
            {
                this.Invoke(new AddLogItemDelegate(AddLogItem), new object[] { msg });
                return;
            }

            try
            {
                logListView.Items.Add(msg);
            }
            catch(Exception err)
            {
                MessageBox.Show(err.ToString());
            }
        }
    }


    public class MyQuickFixApp : QuickFix.IApplication
    {

        public delegate void OnUpdateEvent(string msg);
        public static event OnUpdateEvent UpdateEvent;

        public void FromApp(QuickFix.Message msg, SessionID sessionID) { }
        public void OnCreate(SessionID sessionID) { }
        public void OnLogout(SessionID sessionID)
        {
            Console.WriteLine("Logged out.");
        }
        public void OnLogon(SessionID sessionID)
        {
            UpdateEvent("STUFF!!");
            Console.WriteLine("Logged In.");
        }
        public void FromAdmin(QuickFix.Message msg, SessionID sessionID)
        {

        }
        public void ToAdmin(QuickFix.Message msg, SessionID sessionID) { }
        public void ToApp(QuickFix.Message msg, SessionID sessionID) { }
    }


}

暫無
暫無

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

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