public static T GetResult<T>(this RpcResponseMessage response, bool returnDefaultIfNull = true, JsonSerializerSettings settings = null)
{
if (response.Result == null)
{
if (!returnDefaultIfNull && default(T) != null)
{
throw new Exception("Unable to convert the result (null) to type " + typeof(T));
}
return default(T);
}
try
我正在玩以太坊代码。我注意到一些非常奇怪的。GetResult的第二个参数的类型是bool。第三个是JsonSerializerSettings等类型
但是第一个参数:
类型为"this">
怎么回事?
我认为c#中的this
就像VB.net中的me
:它意味着指向自身的指针。对自身的引用。
为什么类型是this
?
也许真正的类型是RpcResponseMessage。但是这个词是什么状态呢?
我用Telerik将代码转换为vb.net和我得到
Public Shared Function GetResult(Of T)(ByVal response As RpcResponseMessage, ByVal Optional returnDefaultIfNull As Boolean = True, ByVal Optional settings As JsonSerializerSettings = Nothing) As T
If response.Result Is Nothing Then
If Not returnDefaultIfNull AndAlso Nothing IsNot Nothing Then
Throw New Exception("Unable to convert the result (null) to type " & GetType(T))
End If
Return Nothing
End If
又奇怪了。this
这个词没有了。它没有被me
取代。我也想知道为什么我们需要在vb.net中添加byVal ?类总是通过引用传递,基本类型是通过值传递。
同样,代码是这样调用的
return response.GetResult<T>();
哇!。静态类函数由对象调用。很久以前我就听说过对象函数的工作方式是它把自己作为参数传递给一个函数。我从来没见过有人这样直接对待它。
我错过了什么?
我在哪里可以了解更多?这是什么奇怪的语法?
更新:我知道什么是扩展方法。我忘了。在VB.net中,它不使用我或这个。它在vb.net中做得不同,我使用这个转换器将vb.net转换为c#。
https://converter.telerik.com/
我不记得是否有<extension()>之前或之后。这是新的翻译
<Extension()>
Public Shared Function GetResult(Of T)(ByVal response As RpcResponseMessage, ByVal Optional returnDefaultIfNull As Boolean = True, ByVal Optional settings As JsonSerializerSettings = Nothing) As T
If response.Result Is Nothing Then
If Not returnDefaultIfNull AndAlso Nothing IsNot Nothing Then
Throw New Exception("Unable to convert the result (null) to type " & GetType(T))
End If
Return Nothing
End If
End Function
参数的类型是RpcResponseMessage。"This"在类型告诉编译器您想将其用作扩展方法之前添加。
你可以这样调用它(不带或不带"this"):
var response = new RpcResponseMessage();
GetResult<string>(response);
像这样(只有"this"):
var response = new RpcResponseMessage();
response.GetResult<string>();
这就是为什么它被称为"扩展方法"的原因。-它在不修改类的情况下扩展类的功能。