2016-04-15 82 views
0

實體通用對象的類型轉換(從類型對象特定類)

public class CompareParameter<T> 
{ 
    public string FieldName { get; set; } 
    public T FieldValue { get; set; } 
    public CompareType CompareType { get; set; } 
} 

接口

public interface IMongoConnectionFactory 
{ 
    int GetCountWithFilter<T>(params object[] param) where T:EntityBase; 
} 

接口實現

public class MongoConnectionFactory : IMongoConnectionFactory 
{ 
    public int GetCountWithFilter<T>(params object[] param) where T : RedBusPlusEntities.EntityBase 
    { 
     throw new NotImplementationException(); 
    } 
} 

商業行爲準則

public int GetCustomerCount(int operatorId, int day) 
{ 
    Customer c = new Customer(); 

    CompareParameter<int> OpId = new CompareParameter<int>(); 
    OpId.FieldName=GetMemberName.GetName(() => c.OpId); 
    OpId.FieldValue=operatorId; 
    OpId.CompareType=CompareType.EQ; 

    CompareParameter<long> Day = new CompareParameter<long>(); 
    Day.FieldName=GetMemberName.GetName(() => c.Doil); 
    Day.FieldValue=GetStartDateOfIssue(day); 
    Day.CompareType = CompareType.GTE; 

    return _fac.GetCountWithFilter<Customer>(OpId, Day); 
} 

所以在這裏,我傳遞了兩個不同類型的兩個PARAM從商業到DAL。所以我把它從object傳入。現在我該如何構建在接口實現中傳遞的相同類型。嘗試了一些與Convert.ChangeType的方法,但失敗了。有人可以幫助我嗎?

+0

這將有助於瞭解你INT GetCountWithFilter (params對象[] PARAM)內做什麼,因爲它可能比[對象] –

+0

我想其他的東西來傳遞通過傳遞參數對象來創建一個mongo過濾器查詢。 mongo查詢看起來像'var filter = builder.Eq(「cuisine」,「Italian」)&builder。公式(「拉鍊」,10075);'傳遞的對象包含用於創建過濾器 – user3132179

+0

的必要的信息和類型,因此你能不能改變你的接口爲: 公共接口IMongoConnectionFactory { INT GetCountWithFilter (PARAMS CompareParameter [] PARAM)其中T:EntityBase; } –

回答

1

如果我理解正確,你有一個方法 - GetCountWithFilter<T>和參數可以是不同的類型,所以你通過他們作爲object,然後你會知道什麼樣的實際類型?

我的建議是不要這樣做。要傳遞參數爲object,允許呼叫者通過任何東西,然後檢查參數以確定它們的類型是否違反強類型語言的目的。即使類型不是object(它是一個接口),您仍然不希望在運行時弄清楚實際類型是什麼。

接口或類的方法簽名描述消費者應該如何使用它。如果參數的類型是object,那麼消費者無法知道「正確」類型要通過什麼。

您可以創建一個參數類型,包含消費者需要傳遞的參數嗎? 或者,您是否可以在界面上創建兩個方法來反映要傳遞的參數的確切類型?

如果你不能,那麼也許這兩種不同的行爲不能用一個接口來描述。


說了這麼多,這裏有一個直接的答案:

GetCountWithFilter你必須檢查每個對象以查看它的類型是什麼。事情是這樣的:

if(param.length==2 
    && param[0] is CompareParameter<int> 
    && param[1] is int) 
{ 
    var param1 = (CompareParameter<int>)param[0]; 
    var param2 = (int)param[1]; 
    //Now you have your parameters cast as their original types. 
}