我認爲你必須劃分你的答案分爲兩部分:
首先從列表中獲取一個隨機的枚舉類型。我認爲這部分已經通過提供的其他答案解決了。
之後,您希望爲選定的枚舉創建一個隨機值列表。所以你需要一個能夠爲這些類型創建一個有效的隨機值的工廠。最接近你需求的東西應該是AutoPoco。這是很容易地創建充滿了一些你喜歡的,例如
var factory = AutoPoco.AutoPocoContainer.Configure(x =>
{
x.Conventions(c =>
{
c.UseDefaultConventions();
});
x.Include<DataRowWrapper>()
.Setup(row => row.Timestamp).Use<DateTimeUniqueSource>()
.Setup(row => row.Name).Use<LastNameSource>()
.Setup(row => row.Value).Use<ApproximateNumberSource<decimal>>()
.Setup(row => row.Description).Use<RandomReadableStringSource>(10, 20);
});
var session = factory.CreateSession();
var sampleRows = session.List<DataRowWrapper>(1000).Get();
值一堆樣本對象的正如你可以看到你可以爲每個屬性自己的源(.Use<...Source>()
)。 目前已經在項目中一些默認的來源,但我也很喜歡下面做了一些我自己:
public class RandomReadableStringSource : DatasourceBase<string>
{
private readonly char[] _Vocals = new char[] { 'a', 'e', 'i', 'o', 'u' };
private readonly char[] _Consonants = new char[] { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w' };
private Random _Random;
private int _Minimum;
private int _Maximum;
public RandomReadableStringSource()
: this(20)
{ }
public RandomReadableStringSource(int max)
: this(5, max)
{ }
public RandomReadableStringSource(int min, int max)
{
if (min <= 0)
{
throw new ArgumentOutOfRangeException("minimum must be greater zero.");
}
if (min > max)
{
throw new ArgumentOutOfRangeException("minimum must be less or equal maximum.");
}
_Random = new Random();
_Minimum = min;
_Maximum = max;
}
public override string Next(IGenerationSession session)
{
var length = _Random.Next(_Minimum, _Maximum);
var sb = new StringBuilder(length);
for (int i = 0; i < length; i++)
{
var array = i % 2 == 0 ? _Consonants : _Vocals;
sb.Append(array[_Random.Next(array.Length)]);
}
return sb.ToString();
}
}
public class DateTimeUniqueSource : DatasourceBase<DateTime>
{
private Random _Random;
private DateTime _LastDateTime;
public DateTimeUniqueSource()
: this(new DateTime(1900, 1, 1))
{ }
public DateTimeUniqueSource(DateTime startdate)
{
if (startdate == null)
{
throw new ArgumentNullException("startdate");
}
_Random = new Random();
_LastDateTime = startdate;
}
public override DateTime Next(IGenerationSession session)
{
_LastDateTime = _LastDateTime.AddHours(_Random.NextDouble() * 1000);
return _LastDateTime;
}
}
所以,你可以爲每種類型的創建自己的來源,之後很容易創建一批樣品的對象。
比什麼更容易解決?我認爲你有一個你認爲無效的解決方案,然後發佈並讓我們看看。 :) – Chris 2011-02-03 10:12:57