[英]cast object with a Type variable
當然,以下不起作用。 有沒有可能的方法,這非常相似?
Type newObjectType = typeof(MyClass);
var newObject = givenObject as newObjectType;
newObjectType
是Type
類的實例(包含有關類型的元數據)而不是類型本身。
這應該工作
var newObject = givenObject as MyClass;
要么
var newObject = (MyClass) givenObject;
強制轉換為類型的實例確實沒有意義,因為編譯時必須知道變量類型應該是什么,而類型的實例是運行時概念。
var
可以工作的唯一方法是變量的類型在編譯時是已知的。
強制轉換通常是一個編譯時概念,即您必須在編譯時知道類型。
類型轉換是一個運行時概念。
如果需要使用該類型的變量進行調用,並且在編譯時不知道該類型,則可以使用反射:在類型實例上使用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.