现在所有的答案(大多数)实际上回答了问题,但没有一个真正讨论使用泛型。现在这可能不符合您的要求,但可以很容易地添加以解决问题,并且调用应用程序不需要了解返回值的方法。
这很简单。只需定义一个接受泛型类型(请注意
T
)的重载即可。
public T[] GetData<T>(int count)
{
Type tType = typeof(T);
List<T> list = new List<T>();
for (int i = 0; i < count; i++)
list.Add(Activator.CreateInstance<T>());
return list.ToArray();
}
所以这是一个基本的例子,可以通过以下方式调用:
Factory factory = new Factory();
var arr = factory.GetData<double>(10); //returns a typed array of double
现在从调用者的角度来看,我们知道接收到的数据是
double
类型或他们提供的类型。
这是对你最初问题的一种替代方案。但是,如果您的对象数组不总是与最初请求的类型相同,则此方法将无法使用。
编辑
定义数组的方式实际上取决于您如何定义对象,但让我们只采用您最初的概念并将其适应到上述情况:
public T[] GetData<T>(int count)
{
Type tType = typeof(T);
List<T> list = new List<T>();
for (int i = 0; i < count; i++)
list.Add((T)GetRandom(tType));
return list.ToArray();
}
在新的示例中,我们假设方法
GetRandom()
将返回所请求的类型。所请求的类型是基于
typereference
(typeparam)
T
的通用类型。我们可以通过调用
typeof(T)
来获取实际类型。现在在这个例子中,我们简单直接地强制转换
GetRandom()
对象响应(我假设
GetRandom()
返回一个
object
类型)。
最后编辑
如评论所述,您可以将 object GetRandom(Type type)
更改为 T GetRandom<T>()
。这将允许您生成特定类型的随机数。我建议您阅读有关泛型https://msdn.microsoft.com/en-us/library/512aeb7t.aspx的知识。
现在,一个不太明显的事情是你的泛型名称由你自己决定。您不必使用T
,并且可以在一个方法调用中使用多个泛型,就像您可能已经使用的许多方法一样。
** 最终编辑 **
只是为了阐述如何将您的GetRandom方法更改为通用方法,我们仍然必须使用类型
object
进行工作,因为它实际上是唯一允许任何类型进行直接装箱转换的类型。您可以使用
as
关键字,但这可能会导致其他问题。现在,
GetRandom(Type type)
方法正在返回该类型的随机对象。正如所述,这仅限于几种类型,因此让我们组合一个示例。
首先要理解的是如何处理各种类型。现在,个人而言,我喜欢定义一个接口。因此,让我们定义一个接口,使所有我们的随机类型都继承它。如下:
interface IRandomTypeBuilder
{
object GetNext();
}
提供一个简单的界面来使用GetNext()
方法返回一个随机类型实体。这将根据泛型参数T返回一个类型化的响应。
现在介绍一些此接口的简单实现。
class DoubleRandomBuilder : IRandomTypeBuilder
{
static Random rng = new Random();
public object GetNext()
{
return rng.NextDouble() * rng.Next(0, 1000);
}
}
class IntRandomBuilder : IRandomTypeBuilder
{
static Random rng = new Random();
public object GetNext()
{
return rng.Next(int.MinValue, int.MaxValue);
}
}
class StringRandomBuilder : IRandomTypeBuilder
{
static Random rng = new Random();
static string aplha = "abcdefghijklmnopqrstuvwxyz";
public object GetNext()
{
string next = "";
for (int i = rng.Next(4, 10), j = i + rng.Next(1, 10); i < j; i++)
next += aplha[rng.Next(0, aplha.Length)];
return next;
}
}
class BoolRandomBuilder : IRandomTypeBuilder
{
static Random rng = new Random();
public object GetNext()
{
return rng.Next(0, 2) % 2 == 0;
}
}
是的,这些很简单,但我们有4种不同类型,它们都定义了GetNext()
方法,并为该类型返回一个随机值。现在我们可以定义GetRandom<T>()
方法。
public T GetRandom<T>()
{
Type tType = typeof(T);
IRandomTypeBuilder typeGenerator = null;
if (tType == typeof(double))
typeGenerator = new DoubleRandomBuilder();
else if (tType == typeof(int))
typeGenerator = new IntRandomBuilder();
else if (tType == typeof(string))
typeGenerator = new StringRandomBuilder();
else if (tType == typeof(bool))
typeGenerator = new BoolRandomBuilder();
return (T)(typeGenerator == null ? default(T) : typeGenerator.GetNext());
}
GetData
定义为:public T[] GetData<T>(int count);
这样你的方法返回值类型就是正确的了。 - Lasse V. Karlsen