.NET反射-如何在类上实现接口方法?

时间:2019-02-04 02:24:49

标签: .net reflection annotations

我正在尝试为.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),但没有一个绑定选项实际上返回这些方法。

1 个答案:

答案 0 :(得分:0)

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

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