从C++转到C# ,提问两个问题:
C#中没有像C++中的decltype这样的关键字,但是有一个类型运算符"typeof",它可以用来获取类型信息。例如:
int i = 123;
Type t = typeof(i);
关于问题2,可以使用C#中的匿名方法来实现。例如:
class MyClass {
public int DoSome(string s) {...}
}
MyClass obj = new MyClass();
Func<string, int> mydele = delegate(string s) { return obj.DoSome(s); };
Func<string, int>是一个泛型委托,它接受一个字符串参数并返回一个整数。可以使用匿名方法将obj的DoSome方法直接转换为该委托的实例。
也可以使用Lambda表达式来实现:
Func<string, int> mydele = s => obj.DoSome(s);
或者使用方法的引用:
Func<string, int> mydele = obj.DoSome;
这些方法都可以在不声明委托类型的情况下直接将一个方法转换为委托。
但是typeof 还是无法取得静态类型, 比如:
string mystr= "some";
Action<typeof(mystr)> myaction= this.DoSome;
这就通不过, 必须explicly write :Action
但是c++ 就可以 Action<decltype(mystr)>
第二个问题也是这样, 你还是写出了Func的具体定义Func<string,int> , 我是希望能够直接从函数的signature推断出来。
我觉得C#的编译器应该可以做的, 但是不知道咋写。
通过这个回复,我想我大概知道你想干啥了。
那么回复2个关键点,你可以自行查找这个两个关键点的资料
1.常规关键实现,表达式Expresstion。 我们不是要传递Action,如果你想在里面解析我们使用 Exrpesssion<Action> ,然后我们可以通过查询body,参数param知道参数类型,当然这个是运行期,毕竟委托是外面的,我们在编译期根本无从知道外面会传递啥,所以编译期泛型参数根本无法确定
2.非常规实现,在C9以后,官方在不停引入lisp,F#的纯函数编程手段,所以后面可以直接用模式匹配。这种情况下我们也无需在做判定
直接写模式匹配规则就好----------这种倒是可以在编译期直接就确定,反正模式匹配到谁就执行谁,如果没有匹配的走默认(整体类似swich分支选择)
这是两个可能的实现手段。不过我不想写具体代码了。所以相关资料你先找找看。如果有其他问题