我想编写自定义属性.NET模仿Java中的JPA转换器,让我来装饰类,如下所示:
@Entity(name = "PersonTable")
public class Person {
@Convert(converter = PersonNameConverter.class)
private PersonName personName;
}
我想限制用户可通入转换属性是我所定义的特定的接口转换器的类型。
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),但没有一个绑定选项实际上将返回这些方法。
问题是,BooleanConverter明确地实现接口方法,所以为了找到你必须明确指定完整的方法名的方法(见这个答案How can I access an explicitly implemented method using reflection?)。
总之,“ConvertToType1”是不够明确的得到方法。无论是实现该接口不明确,或得到,而不是接口的方法(在上面的回答)