我有以下代码用于以线程安全的方式设置属性(改编自this other SO question,但我无法调整它以获取属性。
这是我在线程安全方式代码中的set属性。
public static void SetPropertyThreadSafe(this TControl self, Action setter)
where TControl : Control
{
if (self.InvokeRequired)
{
var invoker = (Action)(() => setter(self));
self.Invoke(invoker);
}
else
{
setter(self);
}
}
通过执行以下操作来调用:
this.lblNameField.SetPropertyThreadSafe(p => p.Text = "Name:");
这是我尝试使用线程安全方式代码获取属性。
public static TResult GetPropertyThreadSafe(this TControl self, Func getter)
where TControl : Control
{
if (self.InvokeRequired)
{
var invoker = (Func)((TControl control) => getter(self));
return (TResult)self.Invoke(invoker);
}
else
{
return getter(self);
}
}
它不起作用。我希望通过以下方式来称呼它:
string name = this.lblNameField.GetPropertyThreadSafe(p => p.Text);
答案 0 :(得分:3)
你应该可以使用:
public static TResult GetPropertyThreadSafe<TControl, TResult>(this TControl self, Func<TControl, TResult> getter)
where TControl: Control
{
if (self.InvokeRequired)
{
return (TResult)self.Invoke(getter, self);
}
else
{
return getter(self);
}
}
您可以通过以下方式调用它:
bool visible = this.lblNameField.GetPropertyThreadSafe(p => p.Visible)