我正在尝试为.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),但没有一个绑定选项实际上返回这些方法。
答案 0 :(得分:0)
问题在于BooleanConverter显式实现接口方法,因此,要找到该方法,必须显式指定完整的方法名称(请参见答案How can I access an explicitly implemented method using reflection?)。
简而言之,“ ConvertToType1”不够明确,无法获取该方法。要么非显式地实现接口,要么从接口获取方法(在上面的答案中)