Отражение .NET - как получить реализованный метод интерфейса на классе? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь написать пользовательские атрибуты для .net, которые имитируют jpa-конвертер в Java, который позволяет мне украшать класс следующим образом:

@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 голосов
/ 05 февраля 2019

Проблема в том, что BooleanConverter явно реализует методы интерфейса, поэтому, чтобы найти метод, необходимо явно указать полное имя метода (см. Этот ответ Как я могу получить доступ к явно реализованному методу, используя отражение? ).

Короче говоря, "ConvertToType1" не является достаточно явным, чтобы получить метод.Либо реализуйте интерфейс не явно, либо вместо этого получите метод из интерфейса (в ответе выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...