1

私はこのコードを持っています

let inline ProcessExpendableADGroups (input : ('a * SPUser) seq) =
  input
  |> Seq.filter (fun (_, u : SPUser) -> u.IsDomainGroup = true)       
  |> Seq.filter (fun (_, u : SPUser) -> ADUtility.IsADGroupExpandable u.LoginName = true)      
  |> List.ofSeq
  |> List.iter( 
      fun ( li : 'a, u : SPUser) -> 
        let userList = ADUtility.GetUsers u.LoginName 
        if (Seq.length userList <= 500) then
          userList
          |> Seq.filter (fun l -> InfobarrierPolicy.IsUserInPolicy l "FW" = true) 
          |> Seq.iter (
              fun ln ->
                let x = ADUtility.GetNameAndEmail ln 
                let (email, name) = x.Value
                SPUtility.CopyRoleAssignment li u.LoginName ln email name
                li.Update()
              )
          SPUtility.RemoveRoleAssignment li u
      )      

list3 
|> List.iter (
    fun w -> 
      SPUtility.GetDirectAssignmentsforListItems w |> ProcessExpendableADGroups
      SPUtility.GetDirectAssignmentsforFolders w |> ProcessExpendableADGroups
      SPUtility.GetDirectAssignmentsforLists w |> ProcessExpendableADGroups
      SPUtility.GetDirectAssignmentsforWeb w |> ProcessExpendableADGroups
   )

ここで、メソッドGetDirectAssignmentsforListItemsはタプルのシーケンス(SPListItem * SPUser)を返します。GetDirectAssignmentsforWebはタプルのシーケンス(SPWeb * SPUser)を返します。

このシーケンスを、これらのアイテムに対して「Update」というメソッドを呼び出さなければならないことを除いて、これらのアイテムに対して非常によく似た処理を行う関数に送信する必要があります。

ジェネリックパラメーターを使用してメソッドを作成しましたが、ジェネリックパラメーターでUpdateを呼び出すと問題が発生します。

このパラメーターを制約して、パラメーターにUpdateというメソッドが必要であると言うことはできません。

4

2 に答える 2

3

これを行うには、メンバー制約と静的に解決された型パラメーターを使用できます。

let inline ProcessExpendableADGroups (input : (^a * SPUser) seq) = //'
  input
  |> Seq.filter (fun (_, u) -> u.IsDomainGroup && ADUtility.IsADGroupExpandable u.LoginName)       
  |> Seq.iter( 
      fun (li, u) -> 
        let userList = ADUtility.GetUsers u.LoginName 
        if (Seq.length userList <= 500) then
          userList
          |> Seq.filter (fun l -> InfobarrierPolicy.IsUserInPolicy l "FW") 
          |> Seq.iter (
              fun ln ->
                let x = ADUtility.GetNameAndEmail ln 
                let (email, name) = x.Value
                SPUtility.CopyRoleAssignment li u.LoginName ln email name
                (^a : (member Update : unit -> unit) li) //'
              )
          SPUtility.RemoveRoleAssignment li u
      ) 

このトピックに関する一連の役立つ記事もここにあります。

上記の関数に対して行ったいくつかの改善:

  • 一連のは 1 つにSeq.filter折りたたむことができ、常にコードの匂いがします。Seq.filter= true
  • List.ofSeqList.iter置き換えることができますSeq.iter。を使用するSeq.iterと、とにかく遅延シーケンスが評価されます。
  • li: 'aやなどの冗長な型注釈を記述しないでくださいu: SPUser。パイプを使用し、 の型注釈があるためinput、型チェッカーは正しい型を推測できます。
于 2012-09-27T09:23:32.487 に答える
2

制約は次のようになります (メソッドの宣言である必要はありません - 使用する場所だけです)

 (^a: ( member Update: unit-> unit )t))

Updateこれにより、オブジェクトで呼び出されたメソッドが呼び出されますt

于 2012-09-27T09:22:10.253 に答える