简体   繁体   中英

C# struct in generic method

I try to do something like this:

class Program
    {
        public struct frst
        {
            public short Oversize_FrontInch;
            public short Oversize_RearInch;
            public short Oversize_RightInch;
            public short Oversize_LeftInch;
            public short HeightInch;
        }
        public struct sec
        {
            public short Oversize_FrontInch;
            public short Oversize_RearInch;
            public short Oversize_RightInch;
            public short Oversize_LeftInch;
        }
        public void DoSmth<T>() where T:struct
        { 
            T str = new T();
            str.Oversize_FrontInch = (short)2;

        }
    }

but i get "t does not contain a definition for ..." error is there any way do do this? Important thing: for the sake of rest code it is have to be struct.

It would be great to understand more what you're trying to achieve with these seemingly unrelated structs but here's a version which compiles and runs and keeps sec and frst as structs:

DoSmth<sec>();
DoSmth<frst>();

void DoSmth<T>() where T: struct, IOversize
{ 
    T str = default;
    str.Oversize_FrontInch = (short)2;
    Console.WriteLine(str.GetType());
}


public interface IOversize 
{
    short Oversize_FrontInch {get; set;}
}

public struct sec: IOversize
{
    public short Oversize_FrontInch {get; set;}
}        

public struct frst: IOversize
{
    public short Oversize_FrontInch {get; set;}
    public short HeightInch {get; set;}
}

This prints:

sec
frst

I am guessing you want something like this.

Struct cannot inherit so you code cannot do what you want.

You can instead use a base class and inherit data class from it.

But be aware that you need to inherit a default constructor in order to create a dataclass in a generic function.

This is a simple example for you to play with, you can edit and polish it as you want.

using System;

public class HelloWorld
{
    public class baseclass{
        public short Oversize_FrontInch;
        public short Oversize_RearInch;
        public short Oversize_RightInch;
        public short Oversize_LeftInch;
    }
    public class frst:baseclass
    {
        public short HeightInch;
    }
    public class sec:baseclass 
    { 
    }
    
    public static void DoSmth<T>() where T:baseclass, new()
    { 
        T str = new T();
        str.Oversize_FrontInch = (short)2;
        Console.WriteLine(str.Oversize_FrontInch);
    }
    
    public static void Main(string[] args)
    { 
        DoSmth<frst>();
    }
}

Edit: I saw some people suggesting using interface with struct. It is possible. However, it will box all of your value, create performance issue and create unreadable code. I would not recommanded it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM