多次调用 MakeGenericType(..) 是否每次都会创建一个新类型?



>我有一个实体框架代码优先模型,我为该模型创建了一个静态泛型类,该类具有为列表中的每个项目调用的搜索方法。 承认这超出了我的头脑,我认为将类设置为静态可以提高代码清晰度,甚至可能提高性能,因为不必在许多不同的地方创建实例。 所有这些的目标是自动化用户可以搜索、导出哪些属性等。

主要问题是:如果为具有引用类型属性的每个项目(可能是 1000 个)调用 MakeGenericType(...),则该引用类型属性的泛型类型是生成一次并保存在某个地方还是生成 1000 次?

指出任何其他性能犯罪或代码气味是值得赞赏的。

public static class SearchUserVisibleProperties<T>
{
private static List<PropertyInfo> userVisibleProperties { get; set; }
static SearchUserVisibleProperties()
{
userVisibleProperties = typeof(T).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(UserVisibleAttribute))).ToList();
}
public static bool search(T item, string searchString)
{
foreach (PropertyInfo pInfo in userVisibleProperties)
{
object value = pInfo.GetValue(item);
if (value == null)
{
continue;
}
if (pInfo.PropertyType == typeof(string) || pInfo.PropertyType.IsValueType)
{
...unrelevant string matching code...
}
else if ((bool)typeof(SearchUserVisibleProperties<>).MakeGenericType(new Type[] { value.GetType() }).InvokeMember(nameof(search), BindingFlags.InvokeMethod, null, null, new object[] { value, searchString }))
{
return true;
}
}
return false;
}
}

MakeGenericType的文档表明,为泛型类型定义和泛型类型参数的相同组合返回的类型将是相同的:

MakeGenericType返回的Type对象与通过调用生成的构造类型的GetType方法或使用相同的类型参数从同一泛型类型定义创建的任何构造类型的GetType方法获得的Type相同。

这里有一个小实验来证明上面是正确的:

var a = typeof(Tuple<,>).MakeGenericType(typeof(int), typeof(char));
var b = typeof(Tuple<,>).MakeGenericType(typeof(int), typeof(char));
var c = typeof(Tuple<int,char>);
Console.WriteLine(ReferenceEquals(a, b)); // True
Console.WriteLine(ReferenceEquals(a, c)); // True

最新更新