Hi Clint,

 

Your second approach should work out fine. I use that kind of thing when I
want to work with lists of generic types that have different generic
parameters.

 

interface IProperty

{

    object Value {get; set;}

    Type PropertyType {get;}

}

 

interface IProperty<T> : IProperty

{

    new T Value {get; set;}

}

 

class Property<T> : IProperty<T>

{

    public T Value {get;set;}

    public Type PropertyType {get { return typeof(T); }}

    object IProperty.Value { get { return this.Value; } set { this.Value =
(T)value } }

}

 

That kind of thing. Hopefully you can at read C# - if not, I can translate
for you, but am better at C# now than VB.

 

It also sounds like you're doing something akin to dependency injection. If
you have more detail re the problem you want to solve I could make further
suggestions.

 

Cheers.

 

James.

 

From: ozdotnet-boun...@ozdotnet.com [mailto:ozdotnet-boun...@ozdotnet.com]
On Behalf Of Clint Colefax
Sent: Friday, 5 November 2010 09:30
To: ozDotNet
Subject: RE: It's a question of Generics...

 

Thanks James,

 

In the end, I just added the extra generic parameters and continued, it's
not a pretty as I had hoped, but it does work.

 

In the end, my question boiled down to, it I create an interface that has
generic parameters 

 

Interface IMyInterface(of T)

 

 which I then write an implementing class such as

 

Class MyClass implements IMyInterface(of SomeObject)

 

Where I've defined the type of that generic parameter,

 

Then I want a function to return any implementation of the interface

 

Function MyFunction() As IMyInterface(of T)

 

I can't, as like you said, I've not defined the generic parameter

 

If I change this to 

Function MyFunction(Of T)() As IMyInterface(Of T)

 

Then it will work. However, I wanted to be able to set the T to an
implementation of the interface, which has T defined in it, and have it work
it out, like

 

Function MyFunction(Of P As  IMyInterface(Of T))() As IMyInterface(Of T)

 

I could then call it like

 

MyFunction(Of MyClass)() 

 

and it would return an instance of MyClass.

 

Anyway, this was an exploratory exercise, and I'm kind of moving away from
this. One thought I did have was to have 2 interfaces, a non generic one
that defined nothing, and the generic one that inherited from it

 

Interface IMyInterface

 

Interface IMyGenericInterface (Of T)

Inherits IMyInterface

 

Then my function could return any instance of the non generic interface, but
I've not tried this as I've moved on.

 

Thanks for the feedback.

 

 

From: ozdotnet-boun...@ozdotnet.com [mailto:ozdotnet-boun...@ozdotnet.com]
On Behalf Of James Chapman-Smith
Sent: Thursday, 4 November 2010 4:36 PM
To: 'ozDotNet'
Subject: RE: It's a question of Generics...

 

Hi Clint,

 

What you're suggesting here can't work. Type inference only works when
passing a parameter to a function (not a generic parameter). If you want to
return an object of type `IBase(Of T, E)` then the function definition must
include the `T` & `E` types. Your function only has a single generic
parameter so it won't work.

 

Can you post a version of your original code? Or maybe more detail of your
intent? If you can, I might be able to suggest what to do.

 

Cheers.

 

James.

 

From: ozdotnet-boun...@ozdotnet.com [mailto:ozdotnet-boun...@ozdotnet.com]
On Behalf Of Clint Colefax
Sent: Thursday, 4 November 2010 09:55
To: ozdotnet@ozdotnet.com
Subject: It's a question of Generics...

 

Just playing around with some generics, and I'm getting one bit that I'm not
happy with. I thought I had this working, but I've changed something and now
it doesn't. 

 

 

I have an interface 

Interface IBase(Of T, E)

 

And a child interface

Interface ILevel1

 

And a Class

Class Level1

                Implements ILevel1

                Implements IBase(of string, integer)

 

Then I have a factory with a method as such

 

 

Function GetALevel(Of TLevel(Of T, E)() As IBase(Of T, E)

 

In another class, I want to call the following

 

Dim foo as Factory = new Factory

Dim bar as foo.GetALevel(Of ILevel1)()

 

I think that the type of T and E should be inferred from the ILevel
interface. I'm sure I had this working, then a made a number of changes all
around this code, then noticed it wasn't working anymore.

 

Can anyone explain this better?


Thanks

Clint Colefax

Reply via email to