2014-03-19 87 views
11

自.NET 4.5(2012)以來,一些新的擴展方法出現,從System.Reflection.RuntimeReflectionExtensions class。但是,新方法似乎沒有給我們任何新的東西。舉例:System.Reflection.RuntimeReflectionExtensions中方法的用途是什麼?

static void Main() 
{ 
    var prop1 = typeof(string).GetProperty("Length"); 
    var prop2 = typeof(string).GetRuntimeProperty("Length"); // extension, needs: using System.Reflection; 
    Console.WriteLine(prop1 == prop2); 

    Action a = Main; 
    var meth1 = a.Method; 
    var meth2 = a.GetMethodInfo(); // extension, needs: using System.Reflection; 
    Console.WriteLine(meth1 == meth2); 
} 

這寫兩次True

(該==運算符重載在這裏,但即使(object)prop1 == (object)prop2檢查參考平等和(object)meth1 == (object)meth2True)。

那麼這些新公開可見方法的目的是什麼?很顯然,我必須忽略或誤解某些東西。

+0

我也不知道爲什麼這些方法是存在的,因爲內部'GetRuntimeProperty'只是執行相同的'type.GetProperty(name)'方法 –

+0

我看不到任何目的。它是完全多餘的。如果你看看反編譯的代碼,你會看到他們是多麼毫無意義。猜猜有人在進入代碼庫的那一天睡着了。 – leppie

+1

這需要添加以支持WinRT。這是基於COM的,它不支持反射。 CLR內置的語言投影掩蓋了許多怪癖,隱藏了基本類型系統。沒有什麼非常微妙的,在WinRT中,一個字符串是*非常*不同的類型。但它並不完美,不完全確定它們是如何效仿它的。 –

回答

1

GetRuntime *方法用於WinRT項目。由於WinRT使用的類型可能與.NET使用的類型不同,但功能相同且名稱相同,因此這些反射方法可確保返回正確的MemberInfo。如果您運行的是WinRT,則在運行時不需要.NET MemberInfo。

請參閱Hans Passant對原始問題的評論。

+2

這些擴展方法如何對此有用?誰會使用這些擴展方法,誰會在'System.Type'等中使用「舊」實例成員?如果WinRT由於其類型系統而需要特殊行爲,爲什麼它不提供'Type.GetProperties(BindingFlags)'抽象方法的特殊覆蓋,等等?如果他們願意,他們也可以以不同的方式實現非虛擬成員。總之,我看不出擴展是如何有用的。 Downvoting。 –

+2

如果我查看「版本信息」下的['System.Type'文檔](http://msdn.microsoft.com/zh-cn/library/system.type.aspx),它確實包含* .NET for Windows存儲應用*。如果我查看像''GetPropertyImpl''(http://msdn.microsoft.com/en-us/library/system.type.getpropertyimpl.aspx)或['GetProperties(BindingFlags)'](http ://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx),它們不存在於Windows應用商店*的.NET中。那麼爲什麼他們不只是在'System.Type'中包含他們需要的實例方法,而不是創建擴展? –

+0

確保向後兼容性可能是嚴格的規則。這裏有兩種可能的衝突:1)代碼有自己的GetRuntimeField擴展方法; 2)代碼可以反映類型並依賴於它的成員排序。 –

相關問題