2011-09-21 17 views
6

? Estoy intentando registrar información sobre el estado de algunos objetos y clases en mi código. No todas las clases o bibliotecas se implementaron con Serialización. Así que estoy usando Reflection on the Properties para escribir un documento XML del estado. Sin embargo, tengo el desafío de que algunos objetos, como Clases incorporadas (es decir, Cuerdas, DateTime, Números, etc.), tienen una función ToString que imprime el valor de la clase de una manera significativa. Pero para otras clases, llamar a ToString simplemente usa la base heredada ToString para escupir el nombre del tipo de objeto (por ejemplo, un diccionario). En ese caso, quiero examinar recursivamente las propiedades dentro de esa clase.¿Hay alguna manera de saber si un objeto ha implementado ToString explícitamente en C#

Así que si alguien puede ayudarme con la reflexión para averiguar si hay un ToString implementado en la propiedad que estoy viendo, ese no es el método base O para señalar la forma correcta de usar GetValue para recuperar la colección propiedades lo agradecería.

J

Respuesta

10

Para determinar si un método ha anulado el cheque por defecto .ToString()MethodInfo.DeclaringType así:

void Main() 
{ 
    Console.WriteLine(typeof(MyClass).GetMethod("ToString").DeclaringType != typeof(object)); 
    Console.WriteLine(typeof(MyOtherClass).GetMethod("ToString").DeclaringType != typeof(object)); 
} 

class MyClass 
{ 
    public override string ToString() { return ""; } 
} 

class MyOtherClass { 
} 

Imprime:

True 
False 
+0

Usando BindingFlags.DeclaredOnly permite probar directamente. –

+2

Pero puede haber una anulación heredada de una clase base distinta de objeto. – phoog

+0

Derecha. Y la sugerencia de Hans Passant de buscar únicamente anulaciones declaradas por el tipo de tiempo de ejecución del objeto, por lo tanto, es insuficiente. – phoog

Cuestiones relacionadas