我想編寫一個async
方法,但我希望只有在使用特定編譯常量編譯程序集時才能調用它。等效於任務返回異步方法的ConditionalAttribute
ONE我能做到這一點WAY
一種方法是使用編譯指令,即條件編譯常量像這樣:
// Callee
#if FOO
public async Task DoFooAsync()
{
...
}
#end if
// Caller 1
#if Foo
// fire and forget
DoFooAsync();
#endif
// Caller 2
#if Foo
public async Task<T> DoWork<T>()
{
T returnValue = default(T);
// fire but don't forget
var fooTask = DoFooAsync();
// Prepare return value
returnValue = ...;
// Not terribly important but what if the caller wants
// to find out
if (fooTask.Status == Faulted)
{
// do something about it
}
}
#endif
正如你所看到的,它變得相當混亂的寫作所有這些。
另一種方式
這樣做將是使用ConditionalAttribute
的其他方式。但是,從閱讀文檔看來,該屬性僅適用於返回void
的方法。
尚未有這一制約因素,我會很容易使用的屬性一樣了,那會作出代碼,以便更加整潔,更加好來看待和解讀:
// Callee
[Conditional("FOO")]
public Task DoFooAsync() { ... }
// Caller
public async Task<T> DoWork<T>()
{
// fire and forget
DoFooAsync();
// fire but would like to know what happened
var fooTask = DoFooAsync();
T t = GetTee();
if (fooTask.IsFaulted) { ... }
return t;
}
即使我有我的async
方法返回void
而不是Task
,我覺得這樣做很不舒服。
那麼,對於想要返回值的方法,有沒有等效的ConditionalAttribute
?至少對於那些想要返回Task
的方法是否有一個?
您可以創建自己的程序集屬性並動態構造它,但我不確定這是否是您想要的?你能告訴我們,你如何通過這個常量「FOO」,你想通過不斷或動態創建,然後你打算如何改變它? – kuskmen