calling an overloaded method in generic method

后端 未结 5 1656
日久生厌
日久生厌 2021-01-12 23:18
class Test
{
    public BinaryWriter Content { get; private set; }
    public Test Write (T data)
    {
        Content.Write(data);
        return this;
           


        
5条回答
  •  余生分开走
    2021-01-12 23:52

    This is possible but not with generic constraints . You can try to use Reflection and get the appropriate overloaded version of Write method according to type of T.

    Initialize your BinaryWriter with a Stream in your constructor then use Reflection like below:

    class Test
    {
        public BinaryWriter Content { get; private set; }
    
        public Test(Stream stream)
        {
            Content = new BinaryWriter(stream);
        }
    
        public Test Write(T data)
        {
    
            var method = typeof (BinaryWriter).GetMethod("Write", new[] {data.GetType()});
            if (method != null)
            {
                method.Invoke(Content, new object[] { data });
            }
            // here you might want to throw an exception if method is not found
    
            return this;
        }
    }
    

    Here is a test program:

    Test writer;
    using (var fs = new FileStream("sample.txt", FileMode.Open))
    {
         writer = new Test(fs);
         writer = writer.Write(232323);
         writer = writer.Write(true);
         writer = writer.Write(12);
    }
    
    using (var fs = File.Open("sample.txt", FileMode.Open))
    {
        var reader = new BinaryReader(fs);
        Console.WriteLine(reader.ReadInt32());  // 232323
        Console.WriteLine(reader.ReadBoolean()); // true
        Console.WriteLine(reader.ReadByte());    // 12
    }
    

提交回复
热议问题