type function <type>()</type>

时间:2011-01-20 17:45:09

标签: c# xna

我今天在一些图形库中看到过这样的东西,看起来它可能非常有用。

在演示中,我看到它看起来像这样:

Texture2D texture = Content.Load<Texture2D>("Textures//Road");
Effect shader = Content.Load<Effect>("Effects//Road");

我认为它是一个函数,它返回&lt;&gt;中定义的任何类型。括号,并针对不同类型执行不同的操作。

我想自己实现类似的东西,它是如何使用的?

4 个答案:

答案 0 :(得分:9)

它被称为泛型

实施例

public T ConvertValue<T>(Object value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

参考文献:

Generics (C# Programming Guide)

答案 1 :(得分:4)

Load方法可用于加载大量不同类型的内容,包括图像和声音等内容。因此,它可能会返回不同类型的实例(例如您的Texture2dEffect)。

创建可以执行此操作的方法有两种方法。首先,最简单的说,您可以返回Object,这是.NET和XNA世界中每种类型的基类。

public object Load(string path) { /*...*/}

你必须这样使用它:

Texture2D texture = (Texture2D)Content.Load("Textures//Road");

第二种方法是使用泛型。使用泛型,您可以为用户处理强制转换,使其代码更简单。此方法的通用版本为:

public T Load<T>(string path)
{
    return (T)Load(path);
}

你仍在使用旧的加载,但是在返回值之前你正在执行强制转换(对于任何类型的T)。

泛型非常有用,因为您可以使用它们来创建类型安全的代码,而无需创建大量特定于类型的方法版本,例如

public Texture2d LoadTexture2d(string path)
{
    return (Texture2d)Load(path);
}    
public Effect LoadEffect(string path)
{
    return (Effect)Load(path);
}
//500 more versions omitted for brevity

答案 2 :(得分:2)

它称为Generics是为Type Independent编程指定方法和类的好方法。泛型允许您定义类型安全的数据结构,而无需提交实际的数据类型。这样可以显着提高性能并提高质量代码,因为您可以重用数据处理算法而无需复制特定于类型的代码。

一个简单的堆栈示例:

public class Stack<T>
{
   T[] m_Items; 
   public void Push(T item)
   {...}
   public T Pop()
   {...}
}
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
int number = stack.Pop();

上面的类适用于任何类型的字符串或自定义类的对象 在这里查看完整描述

http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topica

http://msdn.microsoft.com/en-us/library/512aeb7t%28VS.80%29.aspx

答案 3 :(得分:0)

Load方法确实定义了应该返回的内容,因此已经为您定义了。在Load方法中,contentLoader决定如何加载它。在加载您自己的数据类型时,还有一些XNA示例。如果您创建类似:.world - 文件的内容。您可以创建自己的AssetLoader,指定如何加载您自己的数据类型。

  1. http://create.msdn.com/en-US/education/catalog/sample/custom_model_importer
  2. http://msdn.microsoft.com/library/bb447743.aspx