2016-04-15 85 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. 
}