Let’s say I have a method that I want to make generic, and so far it had a big switch case of types.

For an simplified example,

switch (field.GetType()) {
case Type.Int: Method((int)x)...
case Type.NullInt: Method((int?)x)...
case Type.Long: Method((long)x)...

I’d like to be able to just call my GenericMethod<T>(field) instead and I’m wondering if this is possible and how would I go around doing it.

GenericMethod(field)

public void GenericMethod<T>(T field)

Can I use reflection to get a type and the pass it into the generic method somehow, is it possible to transform Type into <T>?

Can I have a method on the field object that will somehow give me a <T> type for use in my generic method?

Sorry for a confusing question, I’m not really sure how to phrase it correctly, but basically I want to get rid of switch cases and lots of manual coding when all I need is just the type (but that type can’t be passed as generic from parent class)

  • Cyno@programming.devOP
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    vor 4 Monaten

    The switch case was based on an enum but it is what I want to get rid of. In the end I ended up doing what you wrote there, expect instead of casting I’m just writing

    case Type.Int: return MyTypedMethod<int>(args)
    case Type.IntNull: return MyTypedMethod<int?>(args)
    // etc for another 10+ different types
    

    It just feels like I’m doing something wrong if i have to manually handle every case in a switch (or if else) statement and I was wondering how could I write, for example, a method that would do the conversion from Type.Long to System.Int64 for me, and then I just pass that type into the generic method instead of having to manually translate it into a type every time it is used.

    However, if I have to use reflection maybe hardcoding it manually every time is actually faster and easier to debug so maybe i’m just overthinking it.

    That c# 7 structure looks interesting but not sure it solves my issue, I need to get to the part where i have the generic type T in the first place. I dont know how to get a “T” out of a custom field indicating type, so to speak.

    edit: as for the invalid code, i just wrote it quickly as example but you are right. Pretend it says switch (field.SomeType) instead of it being a method

    • if i have to manually handle every case in a switch (or if else) statement and I was wondering how could I write, for example, a method that would do the conversion

      You could still do it that way with a switch. Only the case part needs to be constant…

      ` switch (field.GetType().ToString()) {

      case “Int”: Method((int)x)…

      case “NullInt”: Method((int?)x)…

      case “Long”: Method((long)x)… `

      Been a while since I last did this though - you may need to do string caseType=field.GetType().ToString() first, then do switch(caseType). I think from memory you can do it the other way though.

      P.S. I clicked on “code” (which just starts/ends with an apostrophe), but it doesn’t want to display as code - I don’t know why