簡體   English   中英

如何避免代碼中的重復邏輯?

[英]How to avoid duplication logic in the code?

我有兩種方法:

static public async Task Delete( Guid id, string path, ViewModelCollection<ProfileData> collection )       
{                                                                                                          
    var jsonText = await File.ReadAllTextAsync( path );                                                    
    var jsonList = JsonConvert.DeserializeObject<List<ProfileData>>( jsonText );                           
    if ( jsonList != null && jsonList.Any() )                                                              
    {                                                                                                      
        var itemToDelete = jsonList                                                                        
            .FirstOrDefault( x => x.Id == id );                                                            
                                                                                                           
        if ( itemToDelete != null )                                                                        
        {                                                                                                  
            jsonList.Remove( itemToDelete );                                                               
        }                                                                                                  
    }                                                                                                      
                                                                                                           
    var output = JsonSerializer.Serialize( jsonList );                                                     
    await File.WriteAllTextAsync( path, output );                                                          
                                                                                                           
    var item = collection.FirstOrDefault( x => x.Id == id );                                               
    if ( item != null ) collection.Remove( item );                                                         
}                                                                                                          
                                                                                                           
static public async Task Delete( Guid id, string path, ViewModelCollection<SubscriptionData> collection )  
{                                                                                                          
    var jsonText = await File.ReadAllTextAsync( path );                                                    
    var jsonList = JsonConvert.DeserializeObject<List<SubscriptionData>>( jsonText );                      
    if ( jsonList != null && jsonList.Any() )                                                              
    {                                                                                                      
        var itemToDelete = jsonList                                                                        
            .FirstOrDefault( x => x.Id == id );                                                            
                                                                                                           
        if ( itemToDelete != null )                                                                        
        {                                                                                                  
            jsonList.Remove( itemToDelete );                                                               
        }                                                                                                  
    }                                                                                                      
                                                                                                           
    var output = JsonSerializer.Serialize( jsonList );                                                     
    await File.WriteAllTextAsync( path, output );                                                          
                                                                                                           
    var item = collection.FirstOrDefault( x => x.Id == id );                                               
    if ( item != null ) collection.Remove( item );                                                         
}                       

我認為問題是立即可見的——ProfileData 只是更改為 SubscriptionData。 問題:如何避免這種情況?

我想要這個:

static public async Task Delete<T>(...){... var itemToDelete = jsonList.FirstOrDefault(x => x.Id == id ...)          

問題是 x.Id 未知 class

問題是 x.Id 未知 class

聲明一個定義您的Id屬性的接口IHasId ,並確保ProfileDataSubscriptionData都實現該接口。

然后,您可以按如下方式約束您的泛型方法聲明:

static public async Task Delete<T>(...) where T : IHasId
{ ... }

(顯然,如果您已經為定義Id屬性的ProfileDataSubscriptionData設置了基數 class,則可以將通用參數限制為該基數 class。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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