簡體   English   中英

使用類型變量強制轉換對象

[英]cast object with a Type variable

當然,以下不起作用。 有沒有可能的方法,這非常相似?

Type newObjectType = typeof(MyClass);

var newObject = givenObject as newObjectType;

newObjectTypeType類的實例(包含有關類型的元數據)而不是類型本身。

這應該工作

var newObject = givenObject as MyClass;

要么

var newObject = (MyClass) givenObject;

強制轉換為類型的實例確實沒有意義,因為編譯時必須知道變量類型應該是什么,而類型的實例是運行時概念。

var可以工作的唯一方法是變量的類型在編譯時是已知的。


更新

強制轉換通常是一個編譯時概念,即您必須在編譯時知道類型。

類型轉換是一個運行時概念。


更新 2

如果需要使用該類型的變量進行調用,並且在編譯時不知道該類型,則可以使用反射:在類型實例上使用MethodInfo Invoke方法。

object myString = "Ali";
Type type = myString.GetType();
MethodInfo methodInfo = type.GetMethods().Where(m=>m.Name == "ToUpper").First();
object invoked = methodInfo.Invoke(myString, null);
Console.WriteLine(invoked);
Console.ReadLine();

我最近遇到了這樣的情況,我需要像Tomislav's answer那樣生成一些代碼。 不幸的是,在世代時期,T 型是未知的。 但是,包含該類型實例的變量是已知的。 該問題的 解決方案 臟黑客/解決方法是:

public void CastToMyType<T>(T hackToInferNeededType, object givenObject) where T : class
{
   var newObject = givenObject as T;
}

然后可以通過CastToMyType(instanceOfNeededType, givenObject)調用CastToMyType(instanceOfNeededType, givenObject)並讓編譯器推斷 T。

您可以使用 IsAssignableFrom 檢查該類型是否存在

if(givenObject.GetType().IsAssignableFrom(newObjectType))

但是你不能在這里使用 var 因為類型在編譯時是未知的。

您可以使用 Convert.ChangeType。 根據msdn ,它

返回一個指定類型的對象,其值等同於指定的對象。

你可以試試下面的代碼:

Type newObjectType = typeof(MyClass);

var newObject = Convert.ChangeType(givenObject, newObjectType);

也許你可以使用泛型來解決這個問題。

public void CastToMyType<T>(object givenObject) where T : class
{
   var newObject = givenObject as T;
}

暫無
暫無

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

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