实体
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);
}
所以在这里我将两个不同类型的两个参数从Business转移到DAL。所以我从object
传递它。现在我如何构造在接口实现中传递的相同类型。用Convert.ChangeType
尝试了一些方法,但失败了。有人可以帮助我吗?
答案 0 :(得分:1)
如果我理解正确,你有一个方法 - GetCountWithFilter<T>
,参数可以是不同的类型,所以你将它们作为object
传递然后你就会弄清楚以后实际的类型是什么?
我的建议是不要这样做。要将参数作为object
传递,允许调用者传递任何,然后检查参数以确定其类型是否违背强类型语言的目的。即使类型不是object
(它是一个界面),您仍然不想在运行时弄清楚实际类型是什么。
接口或类的方法签名描述了消费者应该如何使用它。如果参数属于object
类型,则消费者无法告诉&#34;对&#34;类型要通过。
您可以创建一个包含消费者需要传递的参数类型吗? 或者,您是否可以在界面上创建两种方法来反映要传递的参数的确切类型?
如果你不能,那么两个不同的行为也许不能被一个界面描述。
说了这么多,这是一个直接的答案:
在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.
}