Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否从变量类型获取默认相等比较器?_C#_.net 4.7.2 - Fatal编程技术网

C# 是否从变量类型获取默认相等比较器?

C# 是否从变量类型获取默认相等比较器?,c#,.net-4.7.2,C#,.net 4.7.2,有没有一种方法可以获取给定类型的默认比较器,其中该类型是可变的,并且只有在运行时才知道?考虑以下事项: var RT = typeof(string); var comparer = EqualityComparer<RT>.Default; 对于未来的网络搜索者: 反射不是推荐的方法。也许重构是正确的。例如,现在还不清楚,一旦以这种方式通过反射创建了var comparer,它将如何实际使用 为了缓解性能问题,您可以在创建比较器时缓存比较器,就像EqualityComparer内

有没有一种方法可以获取给定类型的默认比较器,其中该类型是可变的,并且只有在运行时才知道?考虑以下事项:

var RT = typeof(string);
var comparer = EqualityComparer<RT>.Default;
对于未来的网络搜索者: 反射不是推荐的方法。也许重构是正确的。例如,现在还不清楚,一旦以这种方式通过反射创建了
var comparer
,它将如何实际使用

为了缓解性能问题,您可以在创建比较器时缓存比较器,就像
EqualityComparer
内部为每个
T
所做的那样。但这样你的代码就变得更混乱了

也就是说

实现反射的一种更简单的单线方式: 请注意,通过反射访问静态字段或属性时,应将
null
传递给GetValue/SetValue(通常传递包含属性的对象)


同样,此代码不是推荐的方法。可读性、可重用性、维护和错误处理选项并没有得到真正的考虑。此示例仅显示了一种更简单的方法,可以在不引入额外类的情况下获取所需内容。

为什么要这样做?从EqualityComparer获得的任何性能都可能会因反射开销而丢失。此外,您的示例不会编译,具体取决于您存储对象的方式,您可以通过让委托访问
Compare()
,来加快运行时的速度,但您仍然需要使用反射才能获得它。正如其他人所说,不建议为此使用反射。(您计划如何实际使用
var comparer
?更多反射?)FWIW,如果继续沿着反射路径,您不需要额外的“BoxedComparer”类。这里有一行代码:
var comparer=typeof(EqualityComparer).MakeGenericType(RT).GetProperty(“默认”,BindingFlags.Public | BindingFlags.Static).GetValue(null)(需要使用
System.Collections.Generic
System.Reflection
语句)
// Example usage
// Assume "RT" is a Type known only at runtime (e.g., typeof(string))
var box = typeof(BoxedComparer<>);

var generic = box.MakeGenericType(RT);
var specific = (IBoxedComparer) Activator.CreateInstance(generic);

// Now with specific you can get the equality comparer for the runtime type (RT)
var comparer = specific.GetEqualityComparer();

public interface IBoxedComparer
{
   // You need the interface to allow a "typeless" cast
   EqualityComparer GetEqualityComparer()
}

public BoxedComparer<T> : IBoxedComparer 
{
   public EqualityComparer GetEqualityComparer() { return EqualityComparer<T>.Default; }
}
var comparer = typeof(EqualityComparer<>).MakeGenericType(RT).GetProperty("Default", BindingFlags.Public | BindingFlags.Static).GetValue(null);
using System.Collections.Generic;
using System.Reflection;