通用对象类型转换(从类型对象到特定类)

时间:2016-04-15 17:47:57

标签: c# generics casting type-conversion

实体

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尝试了一些方法,但失败了。有人可以帮助我吗?

1 个答案:

答案 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.
}
相关问题