查找对在 Visual Studio 中使用反射调用的方法的所有引用

本文关键字:调用 方法 引用 反射 Visual Studio 查找 | 更新日期: 2023-09-27 18:35:21

我有一个实现ISupportIncrementalLoad接口的类。在此接口中,我使用反射从数据源获取数据。由于我在Visual Studio中使用"查找所有引用"时将方法名称作为字符串传递,因此它找不到这些类。

如果我更改方法的签名,这可能会导致问题,因为我不会收到任何编译时错误,而是会收到运行时错误。

有没有办法传递方法的名称,让视觉工作室接受它作为对方法的引用。

这是我的增量集合类。

public class IncrementalCollection<T> : ObservableCollection<T>, ISupportIncrementalLoading
{
    private bool hasMoreItems;
    private int currentPage;
    private string datasourceClass;
    private string datasourceMethod;
    private List<Object> parameters;
    public IncrementalCollection(string datasourceClass, string datasourceMethod, List<Object> parameters)
    {
        this.datasourceClass = datasourceClass;
        this.datasourceMethod = datasourceMethod;
        this.parameters = parameters;
        this.hasMoreItems = true;
    }
    public void ResetCollection(List<Object> parameters)
    {
        this.parameters = parameters;
        currentPage = 0;
        this.Clear();
    }
    public bool HasMoreItems
    {
        get { return hasMoreItems; }
    }
    public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
    {
        var dispatcher = Window.Current.Dispatcher;
        return Task.Run<LoadMoreItemsResult>(
            async () =>
            {
                uint resultCount = 0;
                List<Object> modifiedParameters = new List<object>(this.parameters);
                modifiedParameters.Add(++this.currentPage);
                Type type = Type.GetType(this.datasourceClass);
                MethodInfo method = type.GetTypeInfo().GetDeclaredMethod(this.datasourceMethod);
                IList<T> result = await (Task<IList<T>>)method.Invoke(Activator.CreateInstance(type, null), modifiedParameters.ToArray());
                if (result == null || result.Count == 0)
                {
                    hasMoreItems = false;
                }
                else
                {
                    resultCount = (uint)result.Count;
                    await dispatcher.RunAsync(
                        CoreDispatcherPriority.Normal,
                        () =>
                        {
                            foreach (T item in result)
                                this.Add(item);
                        });
                }
                return new LoadMoreItemsResult() { Count = resultCount };
            }).AsAsyncOperation<LoadMoreItemsResult>();
    }
}

这就是我初始化增量集合的方式,在这里我想通过以某种方式引用它来传递方法的名称。

List<Object> parameters = new List<Object>();
parameters.Add(url);
parameters.Add(null);
parameters.Add(null);
IncrementalCollection<User> _users = new IncrementalCollection<User>(_dataService.GetType().FullName, "GetUserList", parameters);

提前感谢您的帮助。

查找对在 Visual Studio 中使用反射调用的方法的所有引用

您可以只使用基本的Func样式委托。在您的情况下,使用者正在传入一个接受一个附加参数的委托:

var _users = new IncrementalCollection<User>(page => new DataService().GetUserList(uri, null, null, page));

并且您的IncrementalCollection被修改为使用Func

public class IncrementalCollection<T> : ObservableCollection<T>, ISupportIncrementalLoading
{
  private bool hasMoreItems;
  private int currentPage;
  private Func<int, Task<IList<T>>> func;
  public IncrementalCollection(Func<int, Task<IList<T>>> func)
  {
    this.func = func;
    this.hasMoreItems = true;
  }
  public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
  {
    var dispatcher = Window.Current.Dispatcher;
    return Task.Run<LoadMoreItemsResult>(async () =>
    {
      uint resultCount = 0;
      var result = await func(++this.currentPage);
      if (result == null || result.Count == 0)
      {
        hasMoreItems = false;
      }
      else
      {
        resultCount = (uint)result.Count;
        await dispatcher.RunAsync(
             CoreDispatcherPriority.Normal,
             () =>
             {
               foreach (T item in result)
                 this.Add(item);
             });
      }
      return new LoadMoreItemsResult() { Count = resultCount };
    }).AsAsyncOperation<LoadMoreItemsResult>();
  }
}
但是,我

不能随便放过调度程序代码,我怀疑Task.Run是否必要,因为这似乎是基于 I/O 的。最好用async/await更自然地写它:

public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
  return DoLoadMoreItemsAsync(count).AsAsyncOperation();
}
private async Task<LoadMoreItemsResult> DoLoadMoreItemsAsync(uint count)
{
  var result = await func(++this.currentPage);
  if (result == null || result.Count == 0)
  {
    hasMoreItems = false;
  }
  else
  {
    foreach (T item in result)
      this.Add(item);
  }
  return new LoadMoreItemsResult() { Count = result == null ? 0 : result.Count };
}