Pergunta

Eu tenho um Repositório genérico<T> classe eu quero usar um ObjectDataSource.Repositório<T> vive em um projeto separado chamado DataAccess.De acordo com a este post do MS grupos de notícias (parte relevante copiado abaixo):

Internamente, o ObjectDataSource é chamada de Tipo.GetType(cadeia de caracteres) para obter o tipo, então precisamos seguir a orientação documentada no Tipo.GetType sobre como para obter o tipo de uso genéricos.Você pode se referir a MSDN Library no Tipo.GetType:

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

A partir do documento, você vai aprender que você precisa para usar backtick (`) para indica o nome do tipo que está a utilizar medicamentos genéricos.

Também aqui temos de especificar o nome do assembly no nome do tipo string.

Assim, para a sua pergunta, a resposta é usar o nome do tipo, como segue:

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[Sistema.Seqüência De Caracteres],TestObjectDataSourceAssembly"

Ok, faz sentido.Quando eu tentar, no entanto, a página lança uma exceção:

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

[InvalidOperationException:O tipo especificado na propriedade TypeName de ObjectDataSource 'MyDataSource' não pôde ser encontrado.]

O curioso é que isso só acontece quando eu estou vendo a página.Quando eu abrir o "Configurar Fonte de Dados de diálogo" do VS2008 designer, ele mostra corretamente-me os métodos no meu Repositório genérico de classe.Passando o TypeName de seqüência de caracteres para escrever.GetType() durante a depuração também retorna um tipo válido.Então, o que dá?

Foi útil?

Solução

Fazer algo como isso.

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

obter o valor de assemblyQualifiedName e cole-o na TypeName campo.Observe que o Tipo.GetType(seqüência de caracteres), o valor passado deve ser

A assembleia-nome qualificado do tipo get.Ver AssemblyQualifiedName.Se o tipo estiver em execução no momento da assembleia ou em Mscorlib.dll, é suficiente para fornecer o nome do tipo qualificado pelo seu namespace.

Assim, ele pode trabalhar por passagem em que seqüência de caracteres no código, porque essa classe está em execução no momento da assembléia, onde você está chamando-o), onde, como o ObjectDataSource é não.

Provavelmente o tipo que você está procurando é

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

Outras dicas

Eu sei que este é um post antigo, mas recentemente tive o mesmo problema.Outra solução seria substituir a herança com o objeto de composição, por exemplo,

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

    // ctor omitted for clarity
    // ...

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

Desta forma, o ObjectDataSource não sabe sobre o repositório, porque oculto dentro da classe.Eu tenho uma biblioteca de classe na minha camada de fachada que é perfeitamente razoável local para colocar este código no projeto que eu estou trabalhando.

Além disso, se você estiver usando o Resharper e interfaces, a sua possível obter Resharper para fazer a refatoração usando Resharpers "Implementar utilizando o campo" função.

Darren,

Muito, muito obrigado pelo seu post.Eu estive lutando com isto todo o dia.Estranhamente, no meu caso, eu preciso duplo colchetes, ex:para o seu pedaço de código:

MyProject.Repositório`1[[MyProject.MessageCategory, DataAccess, Versão=1.0.0.0, Culture=neutral, PublicKey=null]], DataAccess, Versão=1.0.0.0, Culture=neutral, PublicKey=null

Roger

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top