【问题标题】:generic object type conversion (From type object to Specific Class)泛型对象类型转换(从类型对象到特定类)
【发布时间】:2016-04-15 17:47:57
【问题描述】:

实体

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

【问题讨论】:

  • 了解您在 int GetCountWithFilter(params object[] param) 中所做的工作会很有帮助,因为它可能会传入 object[] 以外的其他内容
  • 我正在尝试通过传递参数对象来创建一个 mongo 过滤器查询。 mongo 查询看起来像 var filter = builder.Eq("cuisine", "Italian") &amp; builder.Eq("zip", 10075); 传递的对象包含创建过滤器所需的信息和类型
  • 所以你能不能把你的界面改成: public interface IMongoConnectionFactory { int GetCountWithFilter(params CompareParameter[] param) where T:EntityBase; }
  • @ScottMorken In params CompareParameter&lt;T&gt;[] param T 与 GetCountWithFilter 的 T 不同。从CompareParameter 实体定义中也可以看出,该实体的 T 会因对象而异。

标签: c# generics casting type-conversion


【解决方案1】:

如果我理解正确,你有一个方法 - GetCountWithFilter&lt;T&gt; 并且参数可能是不同的类型,所以你将它们作为object 传递,然后你会弄清楚实际的类型是什么?

我的建议是不要这样做。要将参数作为object 传递,允许调用者传递anything,然后检查参数以确定它们的类型违背了强类型语言的目的。即使类型不是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.
}

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多