2014-11-03 84 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

相關問題