【发布时间】:2014-03-20 13:24:46
【问题描述】:
我已经用 C# 试验了几个星期的扩展方法,并且遇到了一些有趣的事情。我已经尝试为我的 DTO 构建泛型,如下所示:
public class ParentDto{
public string attrStr{get;set;}
}
public static class ParentDtoExtensions{
public static T AttrStr<T>(this T parentDto, string attrStr)
where T:ParentDto{
parentDto.attrStr = attrStr;
return parentDto;
}
}
然后在子类中:
public class ChildDto:ParentDto{
public string childAttrStr{get;set;}
}
public static class ChildDtoExtensions{
public static T ChildAttrStr<T>(this T childDto, string childAttrStr)
where T:ChildDto{
childDto.childAttrStr = childAttrStr;
return childDto;
}
}
然后让我像这样链接我的方法:
return ((new ChildDto()).AttrStr("someString").ChildAttrStr("someOtherString"));
这真的很吸引我。能够拥有 monad-ish setter 以及其他方法返回调用类型对于链接代码块非常方便。
但是,我希望能够将 setter 方法集成到我认为它们真正属于的父类中,同时保持上面显示的现有代码流,但我不知道如何实现返回实现类的子类的方法。比如:
public class ParentDto{
public string attrStr{get;set;}
public T AttrStr<T>(string attrStr)
where T:ParentDto{
parentDto.attrStr = attrStr;
return parentDto;
}
}
但这不起作用,因为编译器(?)不知道调用类型。有谁知道怎么做?
请记住,我不是在寻找关于我现有实现的代码味道的建议,因为我确信有更多的C#-ish 方法可以实现这一点。
【问题讨论】:
-
在这种情况下,使用为您提供了其他方式无法获得的灵活性。
标签: c# generics extension-methods