這裏是最終目標泛型類型定義:得到一個工廠的名字,像這樣factory.CreateConnection<SqlConnection>("my db")
F#獲取型與約束
這裏是我到目前爲止的代碼一個新的連接:
type IConnectionFactory =
abstract member CreateConnection : unit -> IDbConnection
type DefaultConnectionFactory<'t when 't : (new : unit -> 't) and 't :> IDbConnection>() =
member this.CreateConnection() = new 't()
interface IConnectionFactory with
member this.CreateConnection() = this.CreateConnection() :> IDbConnection
type DefaultConnectionFactoryFactory() =
member this.CreateConnectionFactory connectionType =
if not (typeof<IDbConnection>.IsAssignableFrom connectionType)
then invalidArg "connectionType" (sprintf "type %O is not assignable to IDbConnection" connectionType)
let genericFactoryType = typedefof<DefaultConnectionFactory<_>>
let factorytype = genericFactoryType.MakeGenericType([| connectionType |])
Activator.CreateInstance(factorytype) :?> IConnectionFactory
type ConnectionFactory (connectionStrings : Dictionary<string, (IConnectionFactory * string)>) =
let ConnectionStrings = connectionStrings
member this.CreateConnection connectionStringName : 't :> IDbConnection =
if ConnectionStrings.ContainsKey connectionStringName
then
let connectionFactory, connectionString = ConnectionStrings.Item connectionStringName
let connection = connectionFactory.CreateConnection()
connection.ConnectionString <- connectionString
connection :?> 't
else invalidArg "dataSourceName" (sprintf "no data source found named %s" connectionStringName)
在這行:應用默認型「的IDbConnection」的類型推斷變量時 類型約束不匹配:
let genericFactoryType = typedefof<DefaultConnectionFactory<_>>
我得到這個錯誤。一個通用的結構要求的類型「的IDbConnection」有一個公共的默認構造函數考慮進一步增加類型約束
我不知道如何解決它...任何其他建議,歡迎以及
'ConnectionFactoryFactory'? ...如何元。 – Daniel 2012-02-01 20:47:31
如果你認爲有更好的方法,我願意接受這些建議...... – Brad 2012-02-01 20:49:27