Generics - type casting

R

Random

I want to define a generics method so the user can determine what type they
expect returned from the method. By examining the generics argument, I
would determine the operation that needs to be performed and do just that.
However, out of the two possible ways of doing this, neither seems to work.

I thought I could either...

1) overload the method just based on the generics argument
Public Function GetData (Of T As SqlDataReader) (ByRef command as
SqlCommand) As T
...
End Function

Public Function GetData (Of T As DataSet) (ByRef command as SqlCommand) As T
...
End Function

....or...

2) determine the type without overloading and make sure to return the wanted
type
Public Function GetData (Of T) (ByRef command as SqlCommand) As T
Select Case True
Case TypeOf(T) Is GetType(SqlDataReader)
Return command.ExecuteReader()
Case TypeOf(T) Is GetType(DataSet)
.....(other code)
oDataAdapter.Fill(oDataSet)
Return oDataSet
End Select
End Function

But, #1 doesn't work because changing the generics type won't overload the
function, and #2 doesn't work because I get errors along the lines of "Value
of type '...' cannot be converted to 'T'"

I understand #1 not working, but as long as I'm playing it safe with the
type conversions, why can't I get #2 to work?
 
S

Samuel R. Neff

Might I suggest

Public Function GetDataSet(ByVal command As SqlCommand) As DataSet

and

Public Function GetDataReader(ByVal command As SqlCommand) As
SqlDataReader


If you use a generic method in this situation the user will always
have to specify the type with the method anyways, so building the type
into the method name is just as easy to use.

In short, this situation does not sufficiently benefit from using
Generics.

If you really want to do your #2, you need to add a DirectCast call to
get around the implicit conversion error.

HTH,

Sam
 
R

Random

Thanks, Sam. Actually, being able to use the same method name will help
with the implementation part of what I'm doing.

And, I'd already tried both CType and DirectCast - still won't convert to
'T'.

I just tried a third way to fix this, and apparently if I specify Object as
the return type, I'm okay. Odd.
 
S

Samuel R. Neff

But if you specify Object as a return type then there's really no
point in using Generics....

Was the error different when you tried using DirectCast ?

Sam
 
R

Random

Nope. No difference in error when using DirectCast.

By passing in the type (I also found out I could just pass in Type as a
parameter and that works, too), I can discover how my method needs to
perform.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top