Насколько я понимаю, вы хотите, чтобы сборка Action <...> или Fun c <...> делегировала это требование Control Invoke. Если это так, вы можете украсить существующий делегат generi c следующим образом:
public static class InvokeFunc
{
private class InvokeFuncImpl<TRusult>
{
public Func<TRusult> Func { get; }
public InvokeFuncImpl(Func<TRusult> f)
{
Func = f;
}
public static implicit operator Func<TRusult>(InvokeFuncImpl<TRusult> value)
{
return () =>
{
if(Form.ActiveForm == null)
return value.Func();
if(!Form.ActiveForm.InvokeRequired)
return value.Func();
return (TRusult)Form.ActiveForm.Invoke(value.Func);
};
}
}
private class InvokeFuncImpl<TArg1, TRusult>
{
public Func<TArg1, TRusult> Func { get; }
public InvokeFuncImpl(Func<TArg1, TRusult> f)
{
Func = f;
}
public static implicit operator Func<TArg1, TRusult>(InvokeFuncImpl<TArg1, TRusult> value)
{
return (arg) =>
{
if(Form.ActiveForm == null)
return value.Func(arg);
if(!Form.ActiveForm.InvokeRequired)
return value.Func(arg);
return (TRusult)Form.ActiveForm.Invoke(value.Func, arg);
};
}
}
public static Func<TResult> Bulid<TResult>(Func<TResult> f) => new InvokeFuncImpl<TResult>(f);
public static Func<TArg1, TResult> Bulid<TArg1, TResult>(Func<TArg1, TResult> f) => new InvokeFuncImpl<TArg1, TResult>(f);
}
К сожалению, в C# нет аргумента variadi c generi c, поэтому вы должны сделать перегрузку всех generi c неявно.
Таким образом, вы можете написать такой код:
_f = InvokeFunc.Bulid((bool x) =>
{
textBox1.Multiline = x;
return textBox1.Text.Length;
});
Где _f - это поле типа Fun c и безопасный вызов в любом потоке. В реализации я сделал проверку для требования вызова, поэтому, если это не требуется, то сделал прямой вызов.
И для действия <...>:
public static class InvokeAction
{
private class InvokeActionImpl
{
public Action Action { get; }
public InvokeActionImpl(Action a)
{
Action = a;
}
public static implicit operator Action(InvokeActionImpl value)
{
return () =>
{
if(Form.ActiveForm == null)
value.Action();
else if(!Form.ActiveForm.InvokeRequired)
value.Action();
else
Form.ActiveForm.Invoke(value.Action);
};
}
}
private class InvokeActionImpl<TArg1>
{
public Action<TArg1> Action { get; }
public InvokeActionImpl(Action<TArg1> a)
{
Action = a;
}
public static implicit operator Action<TArg1>(InvokeActionImpl<TArg1> value)
{
return (arg) =>
{
if(Form.ActiveForm == null)
value.Action(arg);
else if(!Form.ActiveForm.InvokeRequired)
value.Action(arg);
else
Form.ActiveForm.Invoke(value.Action, arg);
};
}
}
public static Action Bulid(Action a) => new InvokeActionImpl(a);
public static Action<TArg1> Bulid<TArg1>(Action<TArg1> a) => new InvokeActionImpl<TArg1>(a);
}