Pregunta

El seguimiento de InternalsVisibleTo . He mirado C # clase instanciar interna con el constructor privada, y esto ha ayudado, pero estoy tratando de convertir el objeto devuelto como el tipo interno y, honestamente, no estoy 100% de que esto es posible.

Estoy intentando la vía de reflexión para solucionar este problema, pero estoy teniendo un momento difícil tratando de encontrar la manera de crear una instancia de un tipo interno con métodos privados que utilizan la reflexión. Puedo ir tan lejos como tirando del tipo y conseguir el constructor y la creación de un objeto.

¿Cómo me preformas del molde del objeto si el tipo Deseo fundido es un tipo interno.?

public object InitPrivateCoreObjects(string Type)
{
    Assembly Core = Assembly.Load("Stuff.Core, Version=0.3.3881.21340, Culture=neutral, PublicKeyToken=4fe470e63e2d354e");
    Type TypeToReflect = Core.GetType("Stuff.Core.AssemblyWithIdentifer");
    object o = Activator.CreateInstance(TypeToReflect);
    MethodInfo mi = TypeToReflect.GetMethod("AssemblyWithIdentifer");
    object newObject = mi.Invoke(o,null);
    //alternatively
    //ConstructorInfo ctor = TypeToReflect.GetConstructor(new Type[]{TypeToReflect.GetType()});
    //ctor.Invoke(newObject, null);

    return newObject;
}

Me puede obtener el tipo de la clase interna,
Puedo llamar al constructor y una instancia de un objeto del tipo. Sin embargo, puesto que no tengo ningún acceso al tipo interno no puedo echarlo y manipular desde allí.

Yo entiendo que puedo utilizar Reflection.Emit para crear una nueva clase basada en ese tipo, pero si voy por ese camino entonces puede ser que también acaba de copiar todo el contenido del proyecto que estoy intentando tener acceso a mi proyecto de prueba . Esto sería muy derrochadora y sin sentido y requeriría de mí a tirar cosas de otros proyectos y la creación de un desastre y es absolutamente no es la ruta que quiero ir en este momento.

he visto ejemplos acceso métodos individuales y propiedades pero ninguno que ejemplifican una clase entera. No estoy 100% seguro de que es posible, ya que en el orden de las operaciones de la reflexión ocurre antes de modificadores de acceso se miraban.

Se puede hacer esto, y si es así, ¿cómo?

Por el amor clairification que quería utilizar la instancia de objeto para propósitos de prueba y [Assembly:InternalsVisibleTo("")] no funcionaba debido al error que estoy actualmente trabajando alrededor. Ver aquí para pregunta original.

¿Fue útil?

Solución

Teniendo en cuenta que sólo se conoce el tipo en tiempo de ejecución, no hay ningún concepto muy parecido a "devolver el objeto como el tipo interno". Piense en lo que te gustaría la firma del método para que parezca ... no hay forma de poder expresarlo.

Si el código de llamada sabe sobre él de una manera inflexible de tipos, se debe hacer que el código genérico en lugar:

public T InitPrivateCoreObjects<T>()
{
    Type type = typeof(T);
    ...
    return (T) newObject;
}

... pero si el código de llamada no saber sobre él, que no es útil a la misma.

Si usted podría explicar más acerca de por qué usted piensa que quiere esta capacidad, podríamos intentar sugerir alterantes.

Otros consejos

  

Me puede utilizar Reflection.Emit para crear una nueva clase basada en ese tipo

En realidad, no: código generado usando Reflection.Emit sigue las mismas reglas que el propio C #. No se puede utilizar para la protección de derivación internal.

  

he visto ejemplos acceso métodos y propiedades individuales

Eso es lo que necesita hacer:. Reflexión uso para buscar y llamar a los métodos y propiedades individuales

Un par de alternativas:

  • Modificar la clase interna para poner en práctica alguna de las interfaces, y hacer que la interfaz pública. métodos de llamada en la interfaz de forma normal.
  • Obtener trabajo [InternalsVisibleTo]. Este es el camino correcto a seguir.

Esto no es realmente una respuesta directa a su pregunta, pero puede resultar útil:

ExposedObject

Si usted no tiene acceso al tipo interno, ni tampoco ese tipo de implementar cualquier interfaz pública que considere suficiente para interactuar con él, y que saber de antemano los nombres y firmas de los miembros en ese tipo, esto es probablemente su mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top