【问题标题】:.NET Reflection - how to get implemented interface method on class?.NET Reflection - 如何在类上实现接口方法?
【发布时间】:2019-02-04 02:24:48
【问题描述】:

我正在尝试为 .net 编写自定义属性,以模仿 Java 中的 jpa 转换器,让我可以像这样装饰一个类:

@Entity(name = "PersonTable")
public class Person {

    @Convert(converter = PersonNameConverter.class)
    private PersonName personName;
}

我想将用户可以传递给 Converter 属性的转换器类型限制为我定义的特定接口。

public interface ICustomConverter<T1, T2>
{
    T1 ConvertToType1(T2 source);
    T2 ConvertToType2(T1 source);
}

我在编译期间找不到执行此操作的方法,因此我在运行时使用以下代码对此进行了测试:

class BooleanConverter : ICustomConverter<bool, string>
{
    bool ICustomConverter<bool, string>.ConvertToType1(string source)
    {
        if ("y".Equals(source.ToLower()))
            return true;
        else
            return false;
    }

    string ICustomConverter<bool, string>.ConvertToType2(bool source)
    {
        if (source)
            return "Y";
        else
            return "N";
    }
}

[XmlMapper(ParentNodeName = "Loan")]
class Loan
{
    [CustomConverterAttribute(typeof(BooleanConverter))]
    public bool IsJointAccount { get; set; }
}

public CustomConverterAttribute(Type converter)
    {
        _converter = converter;

        _convertToType1 = converter
            .GetMethod("ConvertToType1", BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy);

        _convertToType2 = converter
            .GetMethod("ConvertToType2", BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy);

        _type1 = _convertToType1.ReturnType;
        _type2 = _convertToType2.ReturnType;

        _converterInstance = ReflectionUtils.CreateInstance(_converter);
    }

但是 .GetMethods() 和 .GetMethod() 都不返回实现的方法。我尝试了各种不同的 BindingFlags,例如 (BindingFlags.DeclaredOnly),但没有一个绑定选项实际上返回这些方法。

【问题讨论】:

  • 我怀疑您必须使用完整的方法名称才能找到您的 ConvertToType1 方法,因为您明确地实现了接口。
  • 我只是做了一个简单的测试,我可以毫不费力地得到一个类实现的方法你能发布更多的代码吗?
  • @thehennyy 是的,这就是问题所在,感谢您和链接的答案,我添加了一个答案

标签: .net reflection annotations


【解决方案1】:

问题在于 BooleanConverter 显式实现了接口方法,因此为了找到方法,您必须显式指定完整的方法名称(请参阅此答案 How can I access an explicitly implemented method using reflection?)。

简而言之,“ConvertToType1”不够明确,无法获取方法。要么非显式实现接口,要么从接口获取方法(在上面的答案中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2010-10-29
    • 2011-08-23
    • 2016-02-01
    相关资源
    最近更新 更多