簡體   English   中英

C#通用方法避免代碼重復

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM