Pergunta

public static IList<T> LoadObjectListAll<T>()
{
    ISession session = CheckForExistingSession();
    var cfg = new NHibernate.Cfg.Configuration().Configure();
    var returnList = session.CreateCriteria(typeof(T));
    var list = returnList.List();
    var castList = list.Cast<typeof(T)>();
    return castList;
}

Então, eu estou recebendo um erro de compilação, onde eu estou lançando a "lista" elemento genérico IList ....alguém pode ver um erro gritante aqui?

Foi útil?

Solução

T não é um tipo, nem um System.Type. T é um tipo de parâmetro. typeof(T) retorna o tipo de T.O typeof o operador não agir sobre um objeto, ele retorna o Type objeto de um tipo. http://msdn.microsoft.com/en-us/library/58918ffs.aspx

@João está correto em responder a sua pergunta direta.Mas o NHibernate código, há um pouco fora.Você não deve ser a configuração do ISessionFactory depois de chegando a ISession, por exemplo.

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

Outras dicas

Eu acho

var castList = list.Cast<typeof(T)>();

deve ser

var castList = list.Cast<T>();

@Jon Limjap O mais gritante erro eu posso ver é que um IList é definitivamente diferente de um IList<T>.Um IList é não-genérico (por exemplo, ArrayList).

A pergunta original já estava usando um IList<T>.Ele foi removido quando alguém editou a formatação.Provavelmente um problema de Markdown.

Corrigido agora.

O IList é uma IList<T>, ele só tem fubared por markdown quando ela postou.Eu tentei formatá-lo, mas eu perdi a escapar <T>..De fixação que agora.

CLI suporta apenas genérico argumentos para a covariância e contravariância, quando o uso de representantes, mas quando uso genéricos existem algumas limitações, por exemplo, você pode converter uma string para um objeto, para a maioria das pessoas assume que você pode fazer o mesmo com a Lista para uma Lista, mas você não pode fazer isso porque não há covariância entre parâmetros genéricos no entanto, você pode simular covariância como você pode ver neste artigo.Então, isso depende do tipo de tempo de execução que é gerado pelo abstract factory.

Que se lê como uma cadeia de markov...Bravo.

T já é um tipo de parâmetro, você não precisa chamar typeof sobre ele.TypeOf leva um tipo e devolve o tipo de parâmetro.

"A pergunta original já estava usando um IList<T>.Ele foi removido quando alguém editou a formatação.Provavelmente um problema de Markdown."

Isso é o que eu vi, mas foi editado por alguém e essa é a razão de eu colocar a minha explicação sobre covariância mas por algum motivo eu estava marcado para -1.

Você tem muitas variáveis temporárias, que são confusos

em vez de

var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;

Basta fazer

return session.CreateCriteria(typeof(T)).List().Cast<T>();

@Jonathan Holanda

T já é um tipo de parâmetro, você não precisa chamar typeof sobre ele.TypeOf leva um tipo e devolve o tipo de parâmetro.

typeof "leva" um tipo e retorna o seu System.Type

CLI suporta apenas genérico argumentos para covariância e contravariância quando o uso de representantes, mas quando uso genéricos existem algumas limitações, por exemplo, você pode converter uma string para um objeto, para a maioria das pessoas assume que você pode fazer o mesmo com List<string> para um List<object> mas você não pode fazer isso porque não há covariância entre parâmetros genéricos no entanto, você pode simular covariância como você pode ver neste artigo.Então, isso depende do tipo de tempo de execução que é gerado pelo abstract factory.

@Jon e @Jonathan está correto, mas você também tem de alterar o tipo de retorno para

IList<T>

também.A menos que esse é apenas um markdown erro.

@Jonathan, achei que era o caso.

Não tenho a certeza qual versão do nHibernate que você está usando.Eu não tentei o ouro do lançamento do 2.0 ainda, mas você pode limpar o método de alguns, removendo algumas linhas:

public static IList<T> LoadObjectListAll()
{
    ISession session = CheckForExistingSession();
    // Not sure if you can configure a session after retrieving it.  CheckForExistingSession should have this logic.
    // var cfg = new NHibernate.Cfg.Configuration().Configure();
    var criteria = session.CreateCriteria(typeof(T));
    return criteria.List<T>();
}

O mais gritante erro eu posso ver é que uma IList é definitivamente diferente de um IList<T>.Um IList não é genérico (por exemplo, ArrayList).

Assim, a sua assinatura do método deve ser:

public static IList<T> LoadObjectListAll()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top