匿名類型在某些場景下使用起來還是比較方便,比如某個類型只會使用一次,那這個時候定義一個 Class 就沒有多少意義,完全可以使用匿名類型來解決,但是在跨項目使用時,還是需要註意避免出現 RuntimeBinderException 問題 問題描述 比如我們有一個 netstandard2.0 類型的 ...
匿名類型在某些場景下使用起來還是比較方便,比如某個類型只會使用一次,那這個時候定義一個 Class 就沒有多少意義,完全可以使用匿名類型來解決,但是在跨項目使用時,還是需要註意避免出現
RuntimeBinderException
問題
問題描述
比如我們有一個 netstandard2.0
類型的類庫項目,裡面有一個這樣的方法:
public static class StandardClass
{
public static dynamic Get()
{
return new { prop1 = "hello", prop2 = 12 };
}
}
然後在一個 net6.0
類型的控制台項目添加下述實例代碼
using ClassLibrary1;
try
{
var test = StandardClass.Get();
var prop1 = test.prop1;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
這個時候,當我們嘗試運行這個控制台項目獲取 prop1
值,這個時候,就會喜提 RuntimeBinderException
解決方案
因為匿名類型預設是 Internal 的訪問級別。這就意味著如果是同一個程式集中通過Dynamic 類型來訪問這個匿名對象是沒有問題,但是如果跨程式集就會導致 RuntimeBinder 無法識別這種類型,從而也就引發了 RuntimeBinderException 異常。解決這種問題有 2 種方法:
- 修改返回類型為強類型,取消匿名類型
- 添加 InternalsVisibleTo 屬性,讓 Internal 級別的對象對外暴露(如下圖所示)