By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
428,685 Members | 1,243 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 428,685 IT Pros & Developers. It's quick & easy.

Generics - type casting

P: n/a
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?

Jun 4 '07 #1
Share this Question
Share on Google+
4 Replies


P: n/a

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
------------------------------------------------------------
We're hiring! B-Line Medical is seeking .NET
Developers for exciting positions in medical product
development in MD/DC. Work with a variety of technologies
in a relaxed team environment. See ads on Dice.com.
On Mon, 4 Jun 2007 09:17:18 -0700, "Random" <ci*******@hotmail.com>
wrote:
>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?

Jun 4 '07 #2

P: n/a
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.

"Samuel R. Neff" <sa********@nomail.comwrote in message
news:2f********************************@4ax.com...
>
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
------------------------------------------------------------
We're hiring! B-Line Medical is seeking .NET
Developers for exciting positions in medical product
development in MD/DC. Work with a variety of technologies
in a relaxed team environment. See ads on Dice.com.
On Mon, 4 Jun 2007 09:17:18 -0700, "Random" <ci*******@hotmail.com>
wrote:
>>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?


Jun 4 '07 #3

P: n/a

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

------------------------------------------------------------
We're hiring! B-Line Medical is seeking .NET
Developers for exciting positions in medical product
development in MD/DC. Work with a variety of technologies
in a relaxed team environment. See ads on Dice.com.
On Mon, 4 Jun 2007 09:50:15 -0700, "Random" <ci*******@hotmail.com>
wrote:
>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.
Jun 4 '07 #4

P: n/a
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.

"Samuel R. Neff" <sa********@nomail.comwrote in message
news:lk********************************@4ax.com...
>
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

------------------------------------------------------------
We're hiring! B-Line Medical is seeking .NET
Developers for exciting positions in medical product
development in MD/DC. Work with a variety of technologies
in a relaxed team environment. See ads on Dice.com.
On Mon, 4 Jun 2007 09:50:15 -0700, "Random" <ci*******@hotmail.com>
wrote:
>>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.

Jun 4 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.