【发布时间】: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