2016-03-10 137 views
0

我有一个问题,我没有线索如何做到这一点。其实我不确定标题是否正确。如何封装具有泛型类型约束的方法

我想封装一个具有泛型参数的方法。这个想法是在方法调用周围添加一些日志记录调用。

因此这个功能

public void Load<T>(T spObject, params Expression<Func<T, object>>[] retrievals) 
{ 
    try 
    { 
     ... .Load(spObject, retrievals);}... 
    } 
} 

应该封装一个函数,它看起来像这样。

public void Load<T>(T spObject, params Expression<Func<T, object>>[] retrievals) 
where T : ClientObject 

Where T : ClientObject已被删除,因为它需要在另一个项目中引用的额外dll

当我试图在那里我得到一个错误说

类型“T”不能用作类型参数“T”的泛型类型或方法“去除Microsoft.SharePoint.Client.ClientRuntimeContext .Load(T,参数...

希望一些有一个想法,我怎么会处理这个问题。

感谢:-) 格尔茨

+0

因为Load方法包含约束https://msdn.microsoft.com/en-us/library/office/ee536388.aspx,如果您从加载方法中将其删除,则可能是用户的方法传递给ClientRuntimeContext.Load方法的对象不是ClientObject –

+0

有没有其他方法来确保对象来自ClientObject?在方法调用方? –

+0

reflaction呢? –

回答

0

这不是封装问题,而是间接引用问题。

如果你不想要链接到这个‘其他’的dll但你仍然想使用load方法,那么你就需要直接引用Microsoft.SharePoint.Client.ClientObject因为这是该load方法的where条款需要的类使用。

这是你的东东什么添加到您的源文件:

using Microsoft.SharePoint.Client; 

然后,你将需要

Microsoft.SharePoint.Client.dll 
Microsoft.SharePoint.Client.Runtime.dll 

添加到您的项目引用。 dll应该在C:\Program Files\Common Files\Microsoft Shared\SharePoint ClientC:\Program Files\Common Files\Microsoft Shared\web server extensions\14\ISAPI,具体取决于您的共享点版本。

这应该足以编译和链接您的程序。

+0

我知道你的意思了。谢谢。但我应该在哪里引用dll?我可以直接参考方法或地点吗? –

-1

您是否考虑过使用动态对象类?这允许在运行时定义对象。

public void Load(dynamic spObject, params Expression<Func<dynamic, object>>[] retrievals){ 
    .. 
} 
+0

看来,动态对象类型不能包含我需要在几个点上的动态操作 - –

相关问题