看到別的語言的實作,也來試試看C#版的
基本思路應該是要放在沒有 ;
的語句裡面,像是 if(){}
或 while(){}
,如果 method 有返回值的應該都可以簡單的呼叫就好,問題出在無返回值的 method
1. 使用 System.Reflection
第一個想到的就是用反射呼叫 Invoke(object, object[])
,把 void method 轉成有回傳值的
1
2
3
4
5
6
7
|
class Program {
static int Main() {
if(typeof(System.Console).GetMethod(nameof(System.Console.WriteLine),
new System.Type[] { typeof(string) }).Invoke(null,
new object[] { "Hello World" })) {}
}
}
|
2. 使用 AsyncWaitHandle.WaitOne
轉成 System.Action<string>
後,用非同步的方式執行,再用 WaitOne
等待他執行完
1
2
3
4
5
6
|
class Program {
static int Main() {
if(((System.Action<string>)System.Console.WriteLine)
.BeginInvoke("Hello World", null, null).AsyncWaitHandle.WaitOne()) {}
}
}
|
3. 使用 is
檢查
這個是網路上查到的,我覺得最直覺的方法 XD,缺點是會跳 CS0184
警告,可以用 #pragma warning disable CS0184
隱藏起來
1
2
3
4
5
6
|
#pragma warning disable CS0184
class Program {
static int Main() {
if(System.Console.WriteLine("Hello World") is object) { }
}
}
|