簡體   English   中英

C#方法使用動態參數重載

[英]C# Method overloading using dynamic params

我正在嘗試編寫一個用於序列化值的工具。 我希望得到一些很好的語法工作.....

            float f = 9999.0f;
            ByteSerializer s = new ByteSerializer ();
            s.Write(f);

Write()的參數可以是任何數字和任何數字:

    public void Write (params dynamic[] objects)
    {

        for (int i =0;i<objects.Length;i++) {

            byteList.AddRange (GetBytes (objects[i]));

        }
    }

現在應該根據傳遞的對象的類型調用GetBytes():

    public  byte[] GetBytes ( object v)
    {
    //Shouldn't actually do anything since it's a dummy
        return new byte[0];
    }


    public  byte[] GetBytes ( System.Single v)
    {
    //Why is this not called?

        return BitConverter.GetBytes (v);

    }

但是它總是直接用於將對象作為參數的方法。 我最初嘗試(params object [])作為方法參數,發現這種行為相當明顯。 但為什么動態[]表現相同?

objects [i] .GetType()報告一個System.Single,那么這里發生了什么? 我想做的就是不可能嗎?

沒有理由不應該像你描述的那樣使用dynamic DLR的主要功能之一是在運行時執行在編譯時已完成的內容(如果已知類型)。 例如,以下程序:

public class Program
{
    public static void Main(string[] args)
    {
        WriteItems("a string", (byte)1, 3f, new object());
    }

    private static void WriteItems(params dynamic[] items)
    {
        foreach(dynamic item in items)
        {
            Write(item);
        }
    }

    private static void Write(byte b)
    {
        Console.WriteLine("Write byte: {0}", b);
    }

    private static void Write(float f)
    {
        Console.WriteLine("Write Single: {0}", f);
    }

    private static void Write(string s)
    {
        Console.WriteLine("Write string: {0}", s);
    }        

    private static void Write(object o)
    {
        Console.WriteLine("Write object: {0}", o);
    }
}

產生輸出:

寫字符串:一個字符串
寫字節:1
單寫:3
寫對象:System.Object

方法重載依賴於在編譯時知道所有參數的類型。 在這里,您無法在編譯時知道參數類型 - 因為它是dynamic - 因此編譯器使用最低的公共類型 - 即object objectdynamic之間的區別在於dynamic允許后期綁定語法 - 但這對您沒有幫助。

如果要為正確的類型調用GetBytes ,則需要使用反射 具體來說,您希望使用GetMethod來查找與每個參數的類型匹配的GetBytes重載,然后調用它。 使用Invoke 像這樣的東西(未經測試):

byteList.AddRange (GetType()
        .GetMethod("GetBytes", new Type[objects[i].GetType()])
        .Invoke(null, new object[objects[i]]));

dynamic類型的行為類似於object類型。 唯一的區別是,對於dynamic ,編譯器不進行類型檢查(因此在使用COM時可以避免編譯器錯誤)。

無論如何,你的意圖是什么。 但是你必須走很長的路,並在你的for循環中做一個明確的類型檢查/強制switch (一個很長但很簡單的switch / case結構)。

HTH托馬斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM