我有一些类具有相同名称的方法。例如
//At the end of ConfigureServices()
services.AddScoped<WindowsPrincipalToClaimPrincipal>();
//Inside Configure(), before app.UseMvc(...);
app.UseAuthentication();
app.UseSession();
app.UseMiddleware<WindowsPrincipalToClaimPrincipal>(); //moving this line to the beginning of Configure() doesn't change anything.
然后,我需要一个像这样的方法:
public class People {
private Long id;
private String nm;
private String nmBn;
.............
public Long getId() {
return id;
}
public String getNm() {
return nm;
}
public String getNmBn() {
return nmBn;
}
}
public class Company {
private Long id;
private String nm;
private String nmBn;
.............
public Long getId() {
return id;
}
public String getNm() {
return nm;
}
public String getNmBn() {
return nmBn;
}
}
因此,这些方法执行相同的操作,但对象类型不同。
有什么方法可以用一种方法做到这一点吗?
请注意,我无法在public String getPeopleString(People people) {
if (people == null) {
return "";
}
return people.getNmBn() + "|" + people.getNm() + "#" + people.getId();
}
public String getCompanyString(Company company) {
if (company == null) {
return "";
}
return company.getNmBn() + "|" + company.getNm() + "#" + company.getId();
}
类或People
类上进行任何更改。
答案 0 :(得分:4)
如果这些类未实现公共接口或扩展公共基类(即,除了名称和签名之外的两组方法之间没有关系),则实现此目的的唯一方法是通过反射。 >
String getString(Object companyOrPeople) throws InvocationTargetException, IllegalAccessException
{
if (companyOrPeople == null) {
return "";
}
final Method getNmBn = companyOrPeople.getClass().getDeclaredMethod("getNmBn");
final String nmBm = getNmBn.invoke(companyOrPeople).toString();
// same with the other two methods
return nmBm + "|" + nm + "#" + id;
}
但是,不建议这样做。您将失去所有这些方法确实存在的编译时保证。没有什么可以阻止某人传递一个Integer或String或其他没有这些吸气剂的类型。
最好的办法是更改现有的类型,但是如果不能,则不能。
如果您决定更改现有类型,那么在您需要时,帮自己一个忙,并更改属性名称。因为nmBn是什么?哦,当然,每个公司都有一个麻将。我真傻。
答案 1 :(得分:1)
首先,您应该使用通用方法创建一个接口,我们将其称为Identifiable
:
public interface Identifiable {
Long getId();
String getNm();
String getNmBn();
}
理想情况下,您可以使People
和Company
都实现此接口,但是正如您所说的,您不能修改现有的Company
和People
类,因此, d然后需要扩展它们,并使子类实现Identifiable
接口:
public PeopleExtended extends People implements Identifiable { }
public CompanyExtended extends Company implements Identifiable { }
现在,只需将getCompanyString
和getPeopleString
方法更改为:
public String getIdString(Identifiable id) {
return id == null ?
"" :
id.getNmBn() + "|" + id.getNm() + "#" + id.getId();
}
显然,可以使用PeopleExtended
和CompanyExtended
子类。