非静态字段,方法或属性“成员”需要对象引用

时间:2013-03-09 22:29:43

标签: c#

`我想在静态方法中更改文本框文本。我怎么能这样做,考虑到我不能在静态方法中使用“this”关键字。换句话说,如何让对象引用文本框文本属性?

这是我的代码

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

    public delegate void myeventhandler(string newValue);


    public class EventExample
    {
        private string thevalue;

        public event myeventhandler valuechanged;

        public string val
        {
            set
            {
                this.thevalue = value;
                this.valuechanged(thevalue);

            }

        }

    }

        static void func(string[] args)
        {
            EventExample myevt = new EventExample();
            myevt.valuechanged += new myeventhandler(last);
            myevt.val = result;
        }

  public  delegate string buttonget(int x);



    public static buttonget intostring = factory;

    public static string factory(int x)
    {

        string inst = x.ToString();
        return inst;

    }

  public static  string result = intostring(1);

  static void last(string newvalue)
  {
     Form1.textBox1.Text = result; // here is the problem it says it needs an object reference
  }



    private void button1_Click(object sender, EventArgs e)
    {
        intostring(1);

    }`

2 个答案:

答案 0 :(得分:3)

如果要从静态方法内部更改非静态对象的属性,则需要通过以下几种方式之一获取对该对象的引用:

  • 该对象作为参数传递给您的方法 - 这个最常见。该对象是您的方法的参数,您可以在其上调用方法/设置属性
  • 该对象在静态字段中设置 - 这个对于单线程程序是可以的,但是当你处理并发时它很容易出错
  • 该对象可通过静态引用获得 - 这是第二种方式的概括:对象可能是 singleton ,您可能正在运行静态注册表您可以通过名称或其他ID获得对象等。

在任何情况下,静态方法都必须获取对象的引用,以便检查其非静态属性或调用其非静态方法。

答案 1 :(得分:0)

你从dasblinkenlight得到了一个完美的答案。以下是第3种方法的示例:

public static  string result = intostring(1);

static void last(string newvalue)
{
    Form1 form = (Form1)Application.OpenForms["Form1"];
    form.textBox1.Text = result;
}

我不完全确定你为什么传递一个字符串参数而不使用它。