Pregunta

Tengo una clase genérica Repository<T> que quiero usar con un ObjectDataSource.El repositorio<T> vive en un proyecto separado llamado DataAccess.De acuerdo a esta publicación de los grupos de noticias de MS (parte relevante copiada a continuación):

Internamente, el ObjectDataSource está llamando a type.gettype (string) para obtener el tipo, por lo que debemos seguir la guía documentada en type.gettype sobre cómo obtener el tipo usando genéricos.Puede consultar la biblioteca MSDN en Type.GetType:

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

Desde el documento, aprenderá que necesita usar Backtick (`) para denotar el nombre de tipo que está utilizando genéricos.

Además, aquí debemos especificar el nombre del ensamblado en la cadena del nombre del tipo.

Entonces, para su pregunta, la respuesta es usar el nombre del tipo como se muestra a continuación:

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[System.String],TestObjectDataSourceAssembly"

Vale, tiene sentido.Sin embargo, cuando lo intento, la página arroja una excepción:

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />

[Excepción de operación no válida:No se pudo encontrar el tipo especificado en la propiedad TypeName de ObjectDataSource 'MyDataSource'.]

Lo curioso es que esto sólo sucede cuando estoy viendo la página.Cuando abro el cuadro de diálogo "Configurar fuente de datos" del diseñador VS2008, me muestra correctamente los métodos en mi clase de Repositorio genérico.Pasar la cadena TypeName a Type.GetType() durante la depuración también devuelve un tipo válido.Entonces, ¿qué pasa?

¿Fue útil?

Solución

Haz algo como esto.

Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;

obtenga el valor de AssemblyQualifiedName y péguelo en el campo TypeName.Tenga en cuenta que Type.GetType (cadena), el valor pasado debe ser

El nombre calificado por ensamblado del tipo que se va a obtener.Ver Nombre calificado de ensamblaje.Si el tipo está en el ensamblado que se está ejecutando actualmente o en Mscorlib.dll, es suficiente proporcionar el nombre del tipo calificado por su espacio de nombres.

Por lo tanto, puede funcionar pasando esa cadena en su código, porque esa clase está en el ensamblado que se está ejecutando actualmente (donde la está llamando), mientras que ObjectDataSource no lo está.

Lo más probable es que el tipo que estás buscando sea

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

Otros consejos

Sé que esta es una publicación antigua, pero recientemente tuve este problema.Otra solución sería reemplazar la herencia con la composición de objetos, p.e.

[DataObject]
public class DataAccessObject {
    private Repository<MessageCategory> _repository;

    // ctor omitted for clarity
    // ...

    [DataObjectMethod(DataObjectMethodType.Select)]
    public MessageCategory Get(int key) {
        return _repository.Get(key);
    }
}

De esta manera, ObjectDataSource no conoce el repositorio porque está oculto dentro de la clase.Tengo una biblioteca de clases en mi capa de fachada que es un lugar perfectamente razonable para colocar este código en el proyecto en el que estoy trabajando.

Además, si está utilizando Resharper e interfaces, es posible hacer que Resharper realice la refactorización utilizando la función "Implementar usando el campo" de Resharper.

darren,

Muchas, muchas gracias por tu post.He estado luchando con esto todo el día.Curiosamente, en mi caso, necesito duplicar los corchetes, por ejemplo.para tu fragmento de código:

MyProject.Repository`1[[MyProject.MessageCategory, DataAccess, Versión=1.0.0.0, Culture=neutral, PublicKey=null]], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

roger

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