C# Can';不能从静态方法更改,但需要使用方法设置非静态属性

C# Can';不能从静态方法更改,但需要使用方法设置非静态属性,c#,wpf,C#,Wpf,我有一个静态的方法,我不能使它成为非静态的,但是我需要使用这个方法设置一个非静态属性,但是我不能,因为它是静态的,建议 //Update property with current availability private static void ReportAvailability() { if (NetworkStatus.IsAvailable) { Conn = true;

我有一个静态的方法,我不能使它成为非静态的,但是我需要使用这个方法设置一个非静态属性,但是我不能,因为它是静态的,建议

//Update property with current availability
        private static void ReportAvailability()
        {
            if (NetworkStatus.IsAvailable)
            {
                Conn = true;
            }
            else
            {
                Conn = false;
            }
        }

        private bool _conn;
        public bool Conn
        {
            get { return _conn; }
            set
            {
                if (_conn != value)
                    _conn = value; RaisePropertyChanged();
            }
        }
    }

将实例传递给静态方法并设置属性

//Update property with current availability
private static void ReportAvailability(SomeType someInstance)
{
    if (NetworkStatus.IsAvailable)
    {
       someInstance.Conn = true;
    }
    else
    {
        someInstance.Conn = false;
    }
}
在您的情况下,在非静态代码中的某个地方使用:

ReportAvailability(this);
这在你的架构设计中有一个严重的缺陷,我强烈建议你在它变成更糟糕的东西之前修复它。不过,为了回答您的问题,您可以声明一个静态HashMap,所有实例都向其注册,然后让您的
ReportAvailability
函数枚举所有当前实例:

public class MyClass : ViewModelBase, IDisposable
{
    static HashSet<MyClass> Instances = new HashSet<MyClass>();

    public MyClass()
    {
        Instances.Add(this);        // register
    }

    // dispose object to de-register 
    public void Dispose()
    {
        Instances.Remove(this);
    }

    private static void ReportAvailability()
    {
        foreach (var instance in Instances)
            instance.Conn = NetworkStatus.IsAvailable;
    }

    private bool _conn;
    public bool Conn
    {
        get { return _conn; }
        set
        {
            if (_conn != value)
                _conn = value; RaisePropertyChanged();
        }
    }

}
公共类MyClass:ViewModelBase,IDisposable { 静态HashSet实例=新HashSet(); 公共MyClass() { 实例。添加(此);//注册 } //处置要注销的对象 公共空间处置() { 实例。移除(此); } 私有静态可用性() { foreach(实例中的var实例) instance.Conn=NetworkStatus.IsAvailable; } 私人布尔康涅狄格州; 公共布尔康涅狄格州 { 获取{return\u conn;} 设置 { 如果(_conn!=值) _conn=值;RaisePropertyChanged(); } } }
不过,认真地说,您应该解决根本问题。首先研究一下依赖注入框架,如etc,它是专门为帮助解决此类问题而设计的(例如,通过控制作用域),而不必求助于这种可怕的黑客手段。

为什么不能使该方法成为非静态的?您可以拥有一个单例对象吗?将方法体更改为:someInstance.Conn=NetworkStatus.IsAvailable;