2014-11-03 83 views
-1

我有一个listAdoParams这是一个List<AdoNetAppenderParameter>转换列表<oneType>到IEnumerable <anotherType>

AdoNetAppenderParameterlog4net库中的一种类型。

namespace log4net.Appender 
{ 
    public class AdoNetAppenderParameter 
    { 
    public AdoNetAppenderParameter(); 
    public DbType DbType { get; set; } 
    public IRawLayout Layout { get; set; } 
    public string ParameterName { get; set; } 
    public byte Precision { get; set; } 
    public byte Scale { get; set; } 
    public int Size { get; set; } 

    public virtual void FormatValue(IDbCommand command, LoggingEvent loggingEvent); 
    public virtual void Prepare(IDbCommand command); 

    } 
} 

我想转换此listAdoParamsIEnumerable<IDataParameter>

namespace System.Data 
{ 
    public interface IDataParameter 
    { 
    DbType DbType { get; set; } 
    ParameterDirection Direction { get; set; } 
    bool IsNullable { get; } 
    string ParameterName { get; set; } 
    string SourceColumn { get; set; } 
    DataRowVersion SourceVersion { get; set; } 
    object Value { get; set; } 
    } 
} 

我该如何做这种转换?

+0

“应用程序不会直接创建IDataParameter接口的实例,但会创建继承IDataParameter的类的实例。” [...](http://msdn.microsoft.com/en-us/library/system.data.idataparameter(v = vs.110).aspx),您需要一个继承自IDataParameter的类,以便转换log4net类型。 – thepirat000 2014-11-03 21:02:08

回答

1

生成一种类型的一对一投影到另一种类型的常用方法是执行Select。如果新类型的接口,你不得不做出这样的接口的实现第一:

class MyDataParameter : IDataParameter { 
    DbType DbType { get; set; } 
    ParameterDirection Direction { get; set; } 
    bool IsNullable { get; } 
    string ParameterName { get; set; } 
    string SourceColumn { get; set; } 
    DataRowVersion SourceVersion { get; set; } 
    object Value { get; set; } 
} 

var res = initial.Select(
    p => new MyDataParameter { 
     DbType = p.DbType 
    , ParameterName = p.ParameterName 
    , ... // and so on 
    } 
).Cast<IDataParameter>(); 

另一种方式是在MyDataParameter一个实例来包装AdoNetAppenderParameter

class MyDataParameter : IDataParameter { 
    private readonly AdoNetAppenderParameter wrapped; 
    public MyDataParameter (AdoNetAppenderParameter w) { 
     wrapped = w; 
    } 
    DbType DbType { 
     get { return wrapped.DbType; } 
     set { wrapped.DbType = value; } 
    } 
    ... // And so on 
} 

现在的投影会看起来更简单:

var res = initial.Select(p => new MyDataParameter(p)).Cast<IDataParameter>(); 
+0

[MyDataParameter]类是否可以包含像[Precision],[Scale]等额外字段,以便它们也是目标映射的一部分? – GilliVilla 2014-11-03 21:13:46

+0

@GilliVilla MyDataParameter类是隐藏的。这个想法只能通过'IDataParameter'接口访问它。向其添加属性或方法是允许的,在这种情况下,它将是无用的:没有人只看到“IDataParameter”就能够访问“Precision”,“Scale”等附加属性。 – dasblinkenlight 2014-11-03 21:16:52

相关问题