C # приведение объекта в лямбду - PullRequest
2 голосов
/ 17 марта 2011

В настоящее время я пытаюсь установить поле, которое мне нужно в бизнес-логике, в данном случае это Lazy. (да не свойство, необходимо установить поле) Я получаю ошибку, что Lazy не может быть преобразован в Lazy как видите:

Объект типа «BusinessLogic.Lazy 1[System.Object]' cannot be converted to type 'BusinessLogic.Lazy 1 [BusinessLogic.ArtikelBLL]

Я использую эту строку для получения динамического хранилища.

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

Затем я пытаюсь установить значение поля, но оно не получается:

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

Я пытался решить это разными способами. Каким-то образом я должен разыграть repository.GetDataById(id) для сущности, которую он ищет, в данном случае это ArtikelBLL (которую я могу получить через pInfo.PropertyType). Но, делая (ArtikelBLL)repository.GetDataById(id), он не останется объектно-ориентированным. Кто-нибудь может помочь мне с этим?

1 Ответ

3 голосов
/ 17 марта 2011

Самый простой способ - просто использовать приведение внутри лямбды:

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

В конце концов, это тот тип, который хочет Lazy<T>.

РЕДАКТИРОВАТЬ: Если выпытаясь сделать это динамически, я предлагаю вам написать общий метод, подобный этому:

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

Затем вызовите этот метод с отражением.(С использованием MethodInfo.MakeGenericMethod(...).Invoke(...))

...