代码之家  ›  专栏  ›  技术社区  ›  Ejrr1085

如何使用“InternalsVisibleTo”从XAML访问另一个程序集中的Internal类转换器

  •  0
  • Ejrr1085  · 技术社区  · 6 年前

    我有这样的东西 converter 不同之处在于,类是内部的,为了安全起见,转换器属于另一个程序集(MyAssembly.dll):

    namespace MyAssembly.InAnotherNameSpace
    {
        internal class ValueConvertor : IValueConverter
            {        
                public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
                {
                    ...
                }
    
                public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
                {
                    ....
                }
            }
    }
    

    我使用 InternalsVisibleToAttribute 要从WPF项目访问转换器,请执行以下操作:

    ....
    xmlns:c="clr-namespace:MyAssembly.InAnotherNameSpace;assembly=MyAssembly"
    ....
     <UserControl.Resources>
            <ResourceDictionary>
                <c:ValueConvertor x:Key="valueConvertor"/>
            </ResourceDictionary>
        </UserControl.Resources>
    

    我在XAML中遇到问题,无法将该类识别为内部类,Visual Studio显示此错误:

    Only public or internal classes can be used within markup. 'ValueConvertor' type is not public or internal. 
    

    按照这个答案 thread ,InternalsVisibleTo无法在XAML中工作,是吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   ASh aminescm    6 年前

    您可以应用一种解决方法-在后台控制代码中创建转换器,并从XAML标记中使用它:

    public partial class View : UserControl
    {
        public static readonly IValueConverter valueConvertor = new MyAssembly.InAnotherNameSpace.ValueConvertor();
    
        public View()
        {
            InitializeComponent();
        }
    }
    
    <TextBlock Text="{Binding Something, Converter={x:Static local:View.valueConvertor}}"/>
    
        2
  •  0
  •   user823959    6 年前

    您可以使用InternalsVisibleTo()在另一个程序集中使用内部类。已通过VS2019和.net 4.7.2进行确认。

    VS2019 XAML编辑器抱怨抛出了一些错误,但运行正常。

    • XDG0009-类型“UserControl1”不可访问。)
    • XLS0419-未定义的CLR命名空间。“clr-namespace”URI引用了找不到的命名空间“WpfControlLibrary2”

    这似乎只是VS XAML编辑器的一个限制。