簡體   English   中英

使用反射在運行時轉換類型?

[英]Converting Types in runtime using reflection?

請看下面的代碼:

        var val1 = ExtractValue(firstParam);
        var val2 = ExtractValue(secondParam);

        var type1 = val1.GetType();
        var type2 = val2.GetType();

        TypeConverter converter1 = TypeDescriptor.GetConverter(type1);
        TypeConverter converter2 = TypeDescriptor.GetConverter(type2);

        if (converter1 != null && converter1.CanConvertFrom(type2))
        {
            var temp = converter1.ConvertFrom(val2);
            return val1.Equals(temp);
        }
        return false;

對我來說,當我使用“int”和Enum對象嘗試它時,此代碼不會返回true,這是一個謎。 我甚至在立即窗口中嘗試了“val1.Equals((int)(val2))”並且結果為true但仍然是converter1.CanConvertFrom(type2)為false。

你能幫我解決一下嗎? 有什么東西我錯過了嗎?

謝謝

在.NET中,廣義類型轉換非常差並且不一致(在我看來)。 但是對於Enum / int情況,您可以使用IConvertible接口或轉換關聯實用程序類:

int converted = (int)Convert.ChangeType(MyEnum.MyValue, typeof(int));

要么

object converted = Convert.ChangeType(myValue, myExpectedType);

作為一個站點說明,這里有100%免費的庫: CodeFluentRuntimeClient有一個名為ConvertUtilities的類,它有一堆ChangeType方法重載(包括一個通用的),它們非常通用,對類型轉換很有用。

請注意文檔中的備注:

正如在此類中實現的,此方法始終返回false 它永遠不會回歸true

如果你有TypeConverter的衍生產品,你唯一能回到不同答案的時間。 但重要的是要注意框架中TypeConverter的許多衍生物(比如說BaseNumberConverter不會覆蓋CanConvertFrom

暫無
暫無

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

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