在不实例化的情况下从另一个类访问非静态方法
本文关键字:访问 静态方法 另一个 实例化 情况下 | 更新日期: 2023-09-27 18:20:54
标题是我的问题。我将在下面解释。
我正在做wpf应用程序是vs2010。我有两个窗口,一个是主窗口,另一个是文件列表窗口。在我的fileList窗口中,我有一个文件列表,单击该列表,应该加载该文件。onClick方法在fileList类中实现。加载文件的函数是在MainWindow分部类中实现的。
我的fileList类在MainWindow类中实例化以显示窗口。我无法再次实例化MainWidow。MainWindow中的函数(方法)不能声明为静态,因为它使用了其他我不能(不知道如何)声明为静态的参数。
我正在下面粘贴相关代码。请帮忙。
namespace test
{
public partial class MainWindow : Window
fileList fl = new fileList;
public MainWindow()
{
InitializeComponent();
fl.show();
}
public void porcessfile(string path)
{
//this method processes the the file at "path". It uses combobox and scrollviewer
//declared in xaml. I dont know how to declare static in xaml, else I will declare
//them static and change the whole method to static, so I can call it without
//instantiating. I tried making a nested-class, but then I can't access variable
//declared in MainWindow (parent) class. Or there is a way to do that?
}
}
另一类:
namespace test
{
public partial class fileList : Window
{
public fileList()
{
IntializeComponent();
}
private void Button_click(object sender, RoutedEventsArgs e)
{
//code that gets "path" on click, works fine.
processfile(string path); // what and how to do here.
}
}
}
我真诚地希望我清楚。如果需要,请询问详细信息。
好吧,最简单的解决方案是简单地为Filelist窗口提供一个构造函数,该构造函数接受指向Mainwindows中processfile方法的委托。看看这篇文章:http://www.codeproject.com/Articles/109000/C-Delegates-Step-by-Step
使其具有统计性并不是解决方案——这将是一个非常丑陋的黑客攻击,会比代理带来更多麻烦。
好吧,这应该很容易。您只需要在FileList类中声明一个事件,该事件在您的Button_click方法中触发,发送文件路径并从MainWindow订阅它,然后用刚刚收到的参数调用您的processfile方法。
在FileList类中:
public event EventHandler<EventArgs<string>> PathReceived = delegate { };
在您的按钮单击中发布此内容。
在您的Contructor:主窗口课程中
this.fileList.PathReceived = (o,args) => this.ProcessFile(args.Value);
发布代码:
this.PathReceived(null, new EventArgs<string>(yourPath));
编辑:我忘了给你提供EventArgs类(它来自我的一个旧项目)。
public class EventArgs<T> : EventArgs
{
/// <summary>
/// Initializes a new instance of the <see cref="EventArgs{T}"/> class.
/// </summary>
/// <param name="value">The value.</param>
public EventArgs(T value)
{
Value = value;
}
/// <summary>
/// Gets the value.
/// </summary>
/// <value>
/// The value.
/// </value>
public T Value { get; private set; }
}
应用程序中的所有窗口都有一个静态方便访问属性:
应用程序.当前Windows
然后简单地取第一个(或者如果有多个,则找出正确的),并转换为MainWindow
类型。现在您有了一个实例来调用您的方法。
尽管它有点反模式(因为它类似于全局变量并保持状态,这使得测试更加困难),但您可以在这里使用singleton模式:
public partial class MainWindow {
private static MainWindow instance = new MainWindow();
public static MainWindow Instance { get { return instance; } }
private FileList fl = new fileList();
private MainWindow() {
InitializeComponent();
fl.show();
}
}
然后,您的文件列表可以使用MainWindow.Instance
。
但是,这样做的副作用是部分隐藏了两个类之间的依赖关系。您真正想要做的是在fileList
的构造函数中需要一个MainWindow
实例。这使依赖关系保持明显,并为使用框架打开了大门(这将帮助您实现可测试性)。
同样,C#约定是调用类FileList
而不是fileList
。
我这样做是为了让一个方法在我的一个类中运行,而不需要进行整个变量设置。
string res = (new myClass ()).methodInsideMyclass ();