2008-09-09 10 views
9

Tengo un Repositorio genérico <T> clase que quiero usar con un ObjectDataSource. El repositorio <T> vive en un proyecto separado llamado DataAccess. De acuerdo con this post from the MS newsgroups (parte pertinente copiado abajo):Uso de clases genéricas con ObjectDataSource

Internamente, el ObjectDataSource está llamando Type.GetType (cadena) para obtener el tipo , por lo que necesitamos para seguir la directriz documentada en Type.GetType sobre cómo a obtener el tipo usando genéricos. Se puede hacer referencia a la biblioteca de MSDN en Type.GetType:

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

Desde el documento, aprenderá que es necesario utilizar comillas invertidas (`) para denota el nombre del tipo que está utilizando los genéricos.

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

Por lo tanto, para su pregunta, la respuesta es utilizar el nombre del tipo como sigue:

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

bien, tiene sentido . Cuando lo intento, sin embargo, la página se produce una excepción:

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

[InvalidOperationException:. El tipo especificado en la propiedad TypeName de ObjectDataSource 'MyDataSource' no se pudo encontrar]

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

Respuesta

13

Haga algo como esto.

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

obtener el valor de assemblyQualifiedName y pegarlo en el campo TypeName. Tenga en cuenta que Type.GetType (cadena), el valor pasado debe ser

El nombre calificado para ensamblar del tipo que se obtendrá. Ver AssemblyQualifiedName. Si el tipo está en el ensamblado que se está ejecutando actualmente o en Mscorlib.dll, es suficiente proporcionar el nombre de tipo calificado por su espacio de nombre.

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

Lo más probable es el tipo que busca es

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 
+0

<% Response.Write (typeof (YourClassName) .AssemblyQualifiedName); %> –

0

Darren,

Muchas, muchas gracias por tu mensaje. He estado peleando con esto todo el día.Extrañamente, en mi caso, necesito doblar los corchetes, p. para su fragmento de código:

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

Roger

1

sé que esto es una entrada antigua, pero recientemente he tenido este problema por mí mismo. Otra solución sería reemplazar la herencia con la composición del objeto, p.

[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 forma, 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 poner este código en el proyecto en el que estoy trabajando.

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

Cuestiones relacionadas