我有一个静态的方法,我不能使它成为非静态的,但是我需要使用这个方法设置一个非静态属性,但是我不能因为它是静态的,建议?
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}
}
答案 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等依赖注入框架,这些框架专门用于帮助解决这类问题(例如通过控制范围),而不必诉诸这些可怕的黑客攻击。