【发布时间】:2015-04-28 22:08:56
【问题描述】:
我一直在开发一个使用Faker.NET 生成假数据的库。我遇到的问题是我不知道如何访问我传递给 DataGenerator 子类的构造函数的匿名方法。
问题是,为了创建泛型列表,我必须创建基类DataGenerator,但我无法拉起我的Func<T> 成员,因为该基类不是泛型,所以没有Tavailable。但是,我的 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,它没有t 继承自System.Object -
但是拳击可以救你...
标签: c# generics reflection