【问题标题】:Can I pass a type argument to a *.xaml.cs class?我可以将类型参数传递给 *.xaml.cs 类吗?
【发布时间】:2013-04-23 18:42:23
【问题描述】:

我想将类型参数传递给我的 *.xaml.cs 文件。 C# 代码将如下所示:

public partial class Filter<T> : Window where T : IFilterableType
{
    private readonly IEnumerable<T> _rows;
    public Filter(IEnumerable<T> rows)
    {
        this._rows = rows;
    }
}

由于这是一个部分类,并且由于 Visual Studio 生成了该类的另一部分,我担心当 Visual Studio 重新生成该部分类的另一部分时,我的类型参数 &lt;T&gt; 会被删除。到目前为止,在我的测试中,这还没有发生,但我想确定一下。

我可以像这样将类型参数传递给 *.xaml.cs 文件吗?

如果没有,我的 *.xaml.cs 类有没有其他方法可以拥有一些泛型类型的私有列表?我会尝试类似下面的内容,但这当然不会编译。

public partial class Filter : Window
{
    private IEnumerable<T> _rows;
    public Filter() { }

    public void LoadList(IEnumerable<T> rows) where T : IFilterableType
    {
        this._rows = rows;
    }
}

【问题讨论】:

标签: c# generics partial-classes type-parameter


【解决方案1】:

很遗憾,您请求的选项在 XAML 中都不可能

【讨论】:

  • 我不明白这个答案。也许我误解了什么。对我来说,他的问题似乎是关于背后的代码而不是 XAML 本身。
  • 我的第一个选项是不可能的,因为 Visual Studio 将删除 &lt;T&gt;?有没有办法让 xaml.cs 文件拥有这样的通用列表?
  • 正如我所说,窗口不能有泛型类型参数。你唯一能做的就是创建一个泛型方法,但是你不能创建一个泛型属性,因为你需要从某个地方获取泛型参数,而且因为在类上不可能,所以没有办法做到这一点。
  • 其实你没这么说。你有这方面的文件吗?我在 MSDN 上找不到有关此问题的任何文档。
  • 我之前尝试过同样的事情,但它不起作用。这是 MSDN 上的一个线程问同样的事情:social.msdn.microsoft.com/forums/en-US/wpf/thread/…
【解决方案2】:

这是另一种选择。我已经让它工作了,但它肯定是丑陋的代码。我使用一个简单的object 变量来保存通用列表。我使用具有约束类型参数的方法来确保我使用的是IFilterableType 接口。我还检查了 DisplayList 方法中的类型,以确保我使用了 IFilterableType 的正确实现。

如果我使用 FilterB 而不是 FilterA 调用 this.DisplayList,我会得到一个异常。这是我能想到的最佳解决方案。

public partial class Filter : Window
{
    public Filter()
    {
        List<FilterA> listA = new List<FilterA>();
        this.SetList<FilterA>(listA);
        this.DisplayList<FilterA>();
    }

    public interface IFilterableType { string Name { get; } }
    public class FilterA : IFilterableType { public string Name { get { return "A"; } } }
    public class FilterB : IFilterableType { public string Name { get { return "B"; } } }


    private object _myList;
    private Type _type;

    public void SetList<T>(List<T> list) where T : IFilterableType
    {
        this._myList = list;
        this._type = typeof(T);
    }

    public void DisplayList<T>() where T : IFilterableType
    {
        if (this._myList is List<T>)
            this.DataContext = (List<T>)this._myList;
        else
            throw new ArgumentException();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多