2011-03-17 2 views
2

Je suis actuellement en train d'essayer de définir un champ dont j'ai besoin dans la logique métier qui est dans ce cas Lazy. (oui non la propriété, il est nécessaire de définir le champ) je reçois l'erreur Lazy ne peut pas être converti en Lazy comme vous pouvez le voir:C# coulée d'un objet dans lambda

Object of type 'BusinessLogic.Lazy 1[System.Object]' cannot be converted to type 'BusinessLogic.Lazy 1[BusinessLogic.ArtikelBLL]

J'utilise cette ligne pour obtenir un référentiel dynamique .

dynamic repository = Activator.CreateInstance(typeof(GenericRepository<>).MakeGenericType(typeArgs)); 

Ensuite, j'essaie de définir la valeur du champ, mais il échoue:

fInfo.SetValue(obj, Lazy.From(() => repository.GetDataById(id))); 

J'ai essayé de le résoudre de nombreuses façons différentes. D'une manière ou d'une autre, je dois lancer repository.GetDataById(id) vers l'entité recherchée, qui est dans ce cas ArtikelBLL (que je peux traverser pInfo.PropertyType). Mais en faisant (ArtikelBLL)repository.GetDataById(id) il ne restera pas orienté objet. Quelqu'un peut-il m'aider s'il vous plaît avec ceci?

+0

Quelques informations que vous pourriez fournir pour de meilleures réponses: Pourquoi ne serait-il plus orienté objet si vous avez écrit '(ArtikelBLL) repository.GetDataById (id)'? Quel est le type du champ? Quelle est la relation entre 'GenericBLL' et' ArtikelBLL' (je suppose que l'un est le dernier est une sous-classe de l'ancien, mais vous pourriez clarifier)? Quel type est l'objet renvoyé par GetDataById? –

+0

ArtikelBLL est en effet une sous-classe de GenericBLL. Parce que le référentiel est dynamique, GetDataById doit renvoyer l'entité (dans ce cas ArtikelBLL) qui est T dans le référentiel . Il n'est pas orienté objet car il est dans un forloop et le référentiel devrait aussi retourner d'autres sous-classes (par exemple j'ai LieferantenBLL), ce qui retournerait des erreurs si je l'ai casté à ArtikelBLL. Le type du champ est Lazy . – Stupidity

Répondre

3

La façon la plus simple serait d'utiliser simplement une distribution à l'intérieur du lambda:

fInfo.SetValue(obj, new Lazy<GenericBLL>(
    () => (ArtikelBLL) repository.GetDataById(id))); 

Après tout, c'est le type le Lazy<T> veut.

EDIT: Si vous essayez de le faire de façon dynamique, je vous suggère d'écrire une méthode générique comme ceci:

public Lazy<T> CreateLazyDataFetcher<T>(dynamic repository) 
{ 
    return new Lazy<T>(() => (T) repository.GetDataById(id)); 
} 

ensuite appeler cette méthode avec la réflexion. (En utilisant MethodInfo.MakeGenericMethod(...).Invoke(...))

+0

Je reçois l'erreur suivante: L'objet de type 'BusinessLogic.Lazy'1 [BusinessLogic.GenericBLL]' ne peut pas être converti en type 'BusinessLogic.Lazy'1 [BusinessLogic.ArtikelBLL]'. – Stupidity

+2

Vous essayez de lancer deux types qui ne sont pas compatibles entre eux. L'un est un Lazy , l'autre est Lazy . – vcsjones

+0

J'ai édité ma question: Le nouveau Lazy () était faux donc j'utilise fInfo.SetValue (obj, Lazy.From (() => repository.GetDataById (id))); cela demandera un Lazy , mais comment est-ce que je jette repository.GetDataById (id) au type de pInfo.PropertyType dans le Lazy? – Stupidity