我一直致力於使用Faker.NET來生成假數據庫。我遇到的問題是我不知道如何訪問我傳遞給我的子類的構造函數的匿名方法。如何從通用列表訪問匿名方法?
的問題是,爲了創造泛型列表我要創建基類DataGenerator
但我不能拉我Func<T>
成員,因爲基類是不通用的,所以沒有T
可用。然而,我的DataGenerator<T>
類確實暴露了我的匿名方法的Generator屬性,但是在迭代我的數據生成器列表時,我還沒有找到訪問它的方法。
任何意見將不勝感激。
這是我到目前爲止有:
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Guid EmpUid { get; set; }
}
// Define other methods and classes here
public abstract class DataGenerator
{
public abstract int GetWeight(string matchingProperty);
public abstract Type Type { get;}
}
public abstract class DataGenerator<T> : DataGenerator
{
public readonly string[] Tags;
public readonly Func<T> Generator;
protected DataGenerator(Func<T> generator, params string[] tags)
{
Tags = tags;
//How to access this?
Generator = generator;
}
public override int GetWeight(string matchingProperty)
{
int sum = (from tag in Tags
where matchingProperty.ToLowerInvariant().Contains(tag.ToLowerInvariant())
select 1).Sum();
return sum;
}
public override Type Type {
get { return typeof(T); }
}
}
public class StringDataGenerator : DataGenerator<string>
{
public StringDataGenerator(Func<string> generator, params string[] tags) : base(generator, tags)
{
}
}
public class GuidDataGenerator : DataGenerator<Guid>
{
public GuidDataGenerator(Func<Guid> generator, params string[] tags)
: base(generator, tags)
{
}
}
而且我在這裏測試它:
private static void Main(string[] args)
{
var dataGeneratorList = new List<DataGenerator>
{
new StringDataGenerator(Name.First, "first", "name"),
new StringDataGenerator(Name.Last, "last", "name"),
new GuidDataGenerator(Guid.NewGuid, "uid", "id")
};
var writeProperties = typeof (Employee).GetProperties().Where(p => p.CanWrite);
foreach (var property in writeProperties)
{
foreach (var dataGenerator in dataGeneratorList)
{
if (property.PropertyType == dataGenerator.Type)
{
var weigth = dataGenerator.GetWeight(property.Name);
//How to access generator here???
var testValue = dataGenerator.Generator.Invoke();
}
}
}
}
爲什麼不添加具有過載'在你的基類object'爲抽象與強制轉換爲'T'實現它? –
我想我早些時候嘗試過@AndreasNiedermair,但由於某種原因,我無法使它工作 –
在基類中添加抽象'object'重載的原因不起作用的是,在我的情況下,Guid.NewGuid返回Guid這不是一個對象,而是一個'struct',它不會從'System.Object'繼承, –