簡體   English   中英

從參數獲取泛型

[英]Get generic type from parameter

我正在制作XNA contentloader:

public object[] LoadIt(KeyValuePair<Type,string>[] resources, ContentManager content)
{
    object[] result = new object[resources.Length];
    for(int i=0;i<result.Length;i++)
    {
        result[i] = content.Load<resources[i].Key>(resources[i].Value);
    }
    return result;
}

但顯然您不允許從變量傳遞泛型,那么我該如何解決呢?

另外,如果您將類型作為通用類型傳遞給方法本身,那么我仍然需要調用該方法的對象來從變量獲取類型,因為要制作一個聲明要加載的文件的文件以及該文件的字符串,我需要傳遞要加載的文件的類型和路徑

這是針對您的問題的特定於XNA的答案,但您無需這樣做!

您可以替換為:

content.Load<resources[i].Key>(resources[i].Value);

有了這個:

content.Load<object>(resources[i].Value);

XNA在運行時會從內容文件本身中自行找出合適的類型。 泛型只是為了方便和類型安全。

如果要自己驗證已加載對象的類型,則可以執行以下操作:

if(result[i].GetType() != resources[i].Key
        && !result[i].GetType().IsSubclassOf(resources[i].Key))
{
    throw new InvalidOperationException();
}

當然,有人會問為什么要制作“ contentloader”? 我沒有您正在做的事情的足夠信息-但似乎沒有必要。 XNA的ContentManager已經實現了( 可自定義的 )已加載對象的緩存-因此,您可能(並且應該)直接使用它。

您根本不能,因為類型不是編譯時常量。

可以做的是使用反射而不會出現問題,因為您只需要object作為返回值:

public object[] LoadIt(KeyValuePair<Type,string>[] resources, ContentManager content)
{
    object[] result = new object[resources.Length];
    for(int i=0;i<result.Length;i++)
    {
        result[i] = content
                      .GetType()
                      .GetMethod("Load")
                      .MakeGenericMethod(resources[i].Key)
                      .Invoke(content, new object[] { resources[i].Value });
    }
    return result;
}

暫無
暫無

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

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