无法从静态方法更改但需要使用方法来设置非静态属性

时间:2016-02-22 23:56:49

标签: c# wpf

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

let submitAll answers info = async {
  let! answerResult = ws.AddAnswersAsync(info.id, answers) |> Async.AwaitIAsyncResult
  return!
    if answerResult
    then ws.SubmitInfo(info) |> Async.AwaitIAsyncResult
    else async {return false}
  }

2 个答案:

答案 0 :(得分:5)

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

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

在您的情况下,非静态代码中的某处使用:

ReportAvailability(this);

答案 1 :(得分:1)

这在您的建筑设计中某处存在严重的缺陷,我强烈建议您在它变成更糟糕的事情之前修复它。要回答你的问题,你可以声明一个静态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();
        }
    }

}

但说真的,你应该解决潜在的问题。首先来看看像Ninject等依赖注入框架,这些框架专门用于帮助解决这类问题(例如通过控制范围),而不必诉诸这些可怕的黑客攻击。