4

I am wondering whether I can upgrade a basic IoC container I am using to support lazy load. So if I have registered IFoo, I would like the IoC container to know how to fulfil both of the following dependencies (the first being the standard way IoC containers work, while the second returns a simple delegate that calls into the container for an IFoo when it is invoked).

public Bar(IFoo x) public Bar2(Func<IFoo> lazyFoo) 

The problem comes when I try to write the code that will actually do this. Is there a syntax that will make the following pseudo-code compile?

public T Resolve<T>() { if (T is Func<X>) return (T) () => Resolve(typeof(X)); return (T)Resolve(typeof(T)); } 

Or to put my question another way, if I have a type T, how can I detect if it is an instance of Func<X>, and if so, what is the type of X?

0

3 Answers 3

3

take a look at this question from this morning - might give you a good start - C# generic list <T> how to get the type of T?

Sign up to request clarification or add additional context in comments.

2 Comments

Indeed, replace List with Func and you're done...
yes, looks like this will do it for me. thanks Now I have a problem that the compiler won't let me cast from () => Resolve(theArgumentType) back to the original T (even if I try to cast to object first). "Cannot convert lambda expression to type 'T' because it is not a delegate type"
1

I misunderstood your question.

It is impossible to do it in one function the way you're trying to because the compiler must have a delegate type to create the lambda as at compile time.

However, this should work.

public T Resolve<T>() { return (T)Resolve(typeof(T)); } public Func<T> LazyResolve<T>() { return () => Resolve<T>(); } 

1 Comment

ok I think I understand why its not possible. Shame, because it would be a nice feature for an IoC container.
0

In answer to the question in the comment, you need to invoke the lambda expression, not cast it.

3 Comments

I don't want to invoke it yet, I want to pass the Func itself back so that the caller can invoke it when they are ready to
Then you need to cast it to Func<T>.
I misunderstood; see second answer.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.