[英]C# Generic Method to avoid code duplication
我正在使用三個具有通用接口的不同類。 但是,界面不包括所有三個方法和屬性。 因此,我遇到了代碼重復的情況,見下文:
if (party is Entity)
{
var entity = party as Entity;
txtName1.Text = entity.Name1;
Address addr = entity.Addresses.FindPrimary();
txtAddr1.Text = addr.Address1;
txtCity.Text = addr.City;
txtZip.Text = addr.Zip;
}
else if (party is CustomerAccount)
{
var acct = party as CustomerAccount;
txtName1.Text = acct.Name1;
Address addr = acct.Addresses.FindPrimary();
txtAddr1.Text = addr.Address1;
txtCity.Text = addr.City;
txtZip.Text = addr.Zip;
}
else if (party is CustomerQuote)
{
var quote = party as CustomerQuote;
txtName1.Text = quote.Name1;
Address addr = quote.Addresses.FindPrimary();
txtAddr1.Text = addr.Address1;
txtCity.Text = addr.City;
txtZip.Text = addr.Zip;
}
有沒有辦法創建一個通用的方法來處理這種情況。 類似於以下內容:
private void getAddressInfo<T>(T party)
{
var sharedType = party as party.GetType();
txtName1.Text = sharedType.Name1;
Address addr = sharedType.Addresses.FindPrimary();
txtAddr1.Text = addr.Address1;
txtCity.Text = addr.City;
txtZip.Text = addr.Zip;
}
Automapper正是為此目的而設計的。 您可以在不同對象類型之間設置映射,它可以自動映射同名屬性。 這是一個簡單的例子 。 這是NuGet 。
如果您不想使用第三方工具,則可以使用此問題的答案之一。
當然,最好的選擇是修改域類,使它們都為它們共有的元素實現接口(例如IAddress
)......但是我假設你問這個問題,因為你沒有這個能力在這種情況下這樣做。
public interface ICompanyAddress
{
public string Name1 {get; set;}
public Address Addresses {get; set;}
//probably other similar stuff
}
public class Entity:ICompanyAddress
{
//all properties which are needed from the interface
}
//all other classes with same properties should also inherit ICompanyAddress
您的類應該繼承此接口。 創建對象時,您將以這種方式創建它們:
ICompanyAddress entity = new Entity();
ICompanyAddress customerAcc= new CustomerAccount();
你調用這樣的方法:
private void SetAddressInfo(ICompanyAddress addressObj)
{
txtName1.Text = addressObj.Name1;
Address addr = addressObj.Addresses.FindPrimary();
txtAddr1.Text = addr.Address1;
txtCity.Text = addr.City;
txtZip.Text = addr.Zip;
}
在這里你如何調用方法:
ICompanyAddress customerAcc= new CustomerAccount();
SetAddressInfo(customerAcc);
如果您不能將所有共享屬性應用於公共接口,那么您可以查看duck typing( 使用Type動態 ),其中屬性和方法在運行時實現。
您可以訪問公共接口的屬性和方法,然后可以轉換為動態類型並調用其他屬性和方法。
例如,假設一個通用接口......
public interface ICommonInterface {
string Name1 { get; }
}
通用方法看起來像這樣......
private void getAddressInfo<T>(T party) where T : ICommonInterface {
//access common properties
txtName1.Text = party.Name1;
//convert to dynamic to call other properties and methods.
dynamic sharedType = party;
Address addr = sharedType.Addresses.FindPrimary();
if (addr != null) {
txtAddr1.Text = addr.Address1;
txtCity.Text = addr.City;
txtZip.Text = addr.Zip;
}
}
並使用這樣的
if (party is Entity || party is CustomerAccount || party is CustomerQuote) {
getAddressInfo(party);
}
雖然這是一個快速的解決方法,但請注意,您不會遇到公共接口中未定義的方法和屬性的編譯時錯誤。 但是,如果代碼無效,則會在運行時捕獲錯誤。 但由於您可以控制代碼,因此您應該事先確保所調用的屬性和方法存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.