[英]Using FastActivator in place of Activator.CreateInstance()
Trying to use Class shown here as a sample for Activator.CreateInstance() http://codeblocks.codeplex.com/wikipage?title=FasterActivator%20Sample 尝试使用此处显示的Class作为Activator.CreateInstance()的示例http://codeblocks.codeplex.com/wikipage?title=FasterActivator%20Sample
public static List<T> SortedCollection<T>(SPListItemCollection items, ListSortType sortType, List<Vote> votes) where T : IVotable
{
var returnlist = new List<T>();
var functionCreator = FastActivator.GenerateFunc<Func<SPListItem, List<Vote>, T>>();
for (int i = 0; i < items.Count; i++) { returnlist.Add(functionCreator(items[i], votes)); }
}
switch (sortType)
{
case ListSortType.Hot:
returnlist.Sort((p1, p2) => p2.HotScore.CompareTo(p1.HotScore));
break;
case ListSortType.Top:
returnlist.Sort((p1, p2) => p2.VoteTotal.CompareTo(p1.VoteTotal));
break;
case ListSortType.Recent:
returnlist.Sort((p1, p2) => p2.CreatedDate.CompareTo(p1.CreatedDate));
break;
}
return returnlist;
}
Error is in the for loop, getting MethodAccessException: 错误在for循环中,获得MethodAccessException:
.Post__041c49eec0a6466da11894b0455b1162(Microsoft.SharePoint.SPListItem, System.Collections.Generic.List
1)` .Post__041c49eec0a6466da11894b0455b1162(Microsoft.SharePoint.SPListItem, System.Collections.Generic.List
1)`
Console App with Error (requires FastActivator class to be in the same namespace): 出现错误的控制台应用程序(要求FastActivator类位于同一名称空间中):
namespace testcase
{
class Program
{
static void Main(string[] args)
{
var vote1 = new Vote() {ItemID=1};
List<Vote> votes = new List<Vote>();
votes.Add(vote1);
List<string> strings = new List<string>();
strings.Add("test");
List<Post> posts = Post.SortedCollection<Post>(strings, ListSortType.Hot, votes);
}
}
internal interface IVotable
{
double HotScore { get; set; }
double VoteTotal { get; set; }
DateTime CreatedDate { get; set; }
}
internal class SCO : IVotable
{
public double HotScore { get; set; }
public double VoteTotal { get; set; }
public DateTime CreatedDate { get; set; }
public SCO(string item, List<Vote> votes)
{
VoteTotal = 10;
HotScore = 10;
CreatedDate = DateTime.Now;
}
public static List<T> SortedCollection<T>(List<string> items, ListSortType sortType, List<Vote> votes) where T : IVotable
{
var returnlist = new List<T>();
Type genericType = typeof(T);
var functionCreator = FastActivator.GenerateFunc<Func<string, List<Vote>, T>>();
for (int i = 0; i < items.Count; i++) { returnlist.Add(functionCreator(items[i], votes)); }
switch (sortType)
{
case ListSortType.Hot:
returnlist.Sort((p1, p2) => p2.HotScore.CompareTo(p1.HotScore));
break;
case ListSortType.Top:
returnlist.Sort((p1, p2) => p2.VoteTotal.CompareTo(p1.VoteTotal));
break;
case ListSortType.Recent:
returnlist.Sort((p1, p2) => p2.CreatedDate.CompareTo(p1.CreatedDate));
break;
}
return returnlist;
}
}
class Vote
{
public double ItemID { get; set; }
}
class VoteMeta
{
public double UpVotes { get; set; }
public double DownVotes { get; set; }
public string CurrentUserVoteClass { get; set; }
}
internal enum ListSortType { Hot, Top, Recent };
class Post : SCO
{
public string Summary { get; set; }
public Uri Link { get; set; }
public Post(string item, List<Vote> votes)
: base(item, votes)
{
Summary = "Summary";
Link = new UriBuilder("http://www.google.com").Uri;
}
}
}
You probably have a non-public constructor somewhere. 您可能在某个地方有一个非公共构造函数。 Not explicitly specifying a visibility on a namespace member makes it internal, not public.
如果未明确指定名称空间成员的可见性 ,则会使其内部可见 ,而不是公共的。 These modifications made your example program work correctly.
这些修改使示例程序可以正常工作。 Note that the dynamic method is in a dynamically generated assembly and as such doesn't have access to internal members.
请注意,动态方法位于动态生成的程序集中,因此无法访问内部成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.