2014-11-24 2 views
3

. Базовые типы Net Framework, такие как Int32, Int64, Boolean и т. Д. реализовать интерфейс IConvertible, но метаданные этих типов не содержат реализаций методов, определенных в IConvertible интерфейсе, таких как ToByte, ToBoolean и т. д.Почему базовые типы .Net Framework не содержат реализаций методов IConvertible?

Я пытаюсь понять, почему базовые типы не имеют реализации метода, даже если они реализуют интерфейс IConvertible. Может ли кто-нибудь помочь в этом?

+1

Для явных методов реализации интерфейса требуется найти BindingFlags.NonPublic. Они частные. –

+0

«Метаданные этих типов не содержат ...» - очень странное утверждение, особенно без упоминания инструментов, которые вы использовали/кода, который вы пробовали. Предполагая, что вы прочитали [System.Int32] (http://msdn.microsoft.com/en-us/library/system.int32 (v = vs.110) .aspx), документация лучше (также вероятно, дублирует) вопрос должна быть «Как получить метаданные на явно реализованных интерфейсах для' Int32', мой код ... не показывает никаких методов ». –

ответ

7

Познакомьтесь с documentation - Int32 орудиями IConvertibleexplicitly.

Когда класс/структура реализует интерфейс явно, вы должны бросить экземпляры этого типа к его интерфейсу перед вызовом этих методов

var asConvertable = (IConvertible) 3; //boxing 
var someByte = asConvertible.ToByte(); 
+0

Благодарим dcastro за указание, что Int32 явно реализует IConvertible. Я понимаю это сейчас. Благодарю. – Raji

+0

Это был спасатель, строя библиотеку netstandard, ориентированную как на нетстандарт, так и на фреймворк. По-видимому, он явственен в версиях netstandard, но не в каркасе (или так говорит мой компилятор). – gregsdennis

2

Int32 и другие примитивные типы реализуют интерфейс explicitlyIConvertible. Явная реализация интерфейса означает, что метод не встречается в публичных методах типа конкретного: вы не можете вызывать его напрямую, вам нужно сначала передать его в интерфейс.

int x = 42; 
IConvertible c = (IConvertible)x; 
byte b = c.ToByte(); 

Для реализации интерфейса явно не указать уровень доступности, и префикс имени метода с именем интерфейса:

byte IConvertible.ToByte() 
{ 
    ... 
} 

Чтобы получить доступ к методу с отражением, вы должны включать в себя полное имя интерфейса:

MethodInfo toByte = 
    typeof(int).GetMethod("System.IConvertible.ToByte", 
          BindingFlags.Instance | BindingFlags.NonPublic); 
+0

Спасибо за подробное объяснение Томаса. – Raji