检查 属性 类型是否使用 Mono.Cecil 重载 == 运算符
Check if property type overloads == operator with Mono.Cecil
我正在使用 Mono.Cecil
编写一个程序,将一些 IL
代码注入 属性 设置器。问题是我需要在 属性 上使用等于运算符到 IL
内。例如:
public class SomeClass
{
private int _property1;
public int Property1
{
get { return _property1; }
set { _property1 = value; }
}
private string _property2;
public string Property2
{
get { return _property2; }
set { _property2 = value; }
}
}
并且 IL
我需要在这些 setter 中注入的代码类似于:
if (value != _property1)
{
//DO SOME STUFF
}
Property2
也是如此。问题是 Property2
是 string
类型,它重载了 ==
运算符,并且在 IL
而不是 ceq
代码中我需要调用 op_Equality
。我的问题是:有什么方法可以检查 ==
运算符是否在 属性 类型上使用 Mono.Cecil
被覆盖?
其实很简单。
我创建了一个 class
public class Foo
{
public static bool operator ==(Foo a, Foo b)
{
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
if (((object)a == null) || ((object)b == null))
{
return false;
}
return a == b;
}
public static bool operator !=(Foo a, Foo b)
{
return !(a == b);
}
}
编译后在mono.cecil
中查看
AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(path);
foreach (var item in assembly.Modules)
{
foreach (var type in item.Types)
{
foreach (var method in type.Methods)
{
if (method.IsStatic && method.IsSpecialName && method.IsPublic && method.Name.Contains("op_Equality"))
{
//that type overides == operator
}
}
}
}
我正在使用 Mono.Cecil
编写一个程序,将一些 IL
代码注入 属性 设置器。问题是我需要在 属性 上使用等于运算符到 IL
内。例如:
public class SomeClass
{
private int _property1;
public int Property1
{
get { return _property1; }
set { _property1 = value; }
}
private string _property2;
public string Property2
{
get { return _property2; }
set { _property2 = value; }
}
}
并且 IL
我需要在这些 setter 中注入的代码类似于:
if (value != _property1)
{
//DO SOME STUFF
}
Property2
也是如此。问题是 Property2
是 string
类型,它重载了 ==
运算符,并且在 IL
而不是 ceq
代码中我需要调用 op_Equality
。我的问题是:有什么方法可以检查 ==
运算符是否在 属性 类型上使用 Mono.Cecil
被覆盖?
其实很简单。 我创建了一个 class
public class Foo
{
public static bool operator ==(Foo a, Foo b)
{
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
if (((object)a == null) || ((object)b == null))
{
return false;
}
return a == b;
}
public static bool operator !=(Foo a, Foo b)
{
return !(a == b);
}
}
编译后在mono.cecil
中查看 AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(path);
foreach (var item in assembly.Modules)
{
foreach (var type in item.Types)
{
foreach (var method in type.Methods)
{
if (method.IsStatic && method.IsSpecialName && method.IsPublic && method.Name.Contains("op_Equality"))
{
//that type overides == operator
}
}
}
}