XAMLServices.Load в интерфейс - PullRequest
       2

XAMLServices.Load в интерфейс

0 голосов
/ 16 января 2019

Я использую C # 7, .Net 4.7.2 и WPF 4.5.2

Я хочу использовать метод XamlServices.Load для импорта данных из текстового файла.

Содержимое файла выглядит так:

<IMyInterface xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns="http://schemas.Demo" 
        x:FactoryMethod="Create" 
        MyProperty="MyValue" />

и строка в коде выглядит следующим образом:

IMyInterface myClass = XamlServices.Load("C:\MyFile.txt") as IMyInterface;

Поскольку IMyInterface является интерфейсом, Загрузка не может создать экземпляр IMyInterface из коробки.

Но подход x:FactoryMethod тоже не работает.

Внешнее исключение говорит

Возникла исключительная ситуация при вызове метода MyNameSpace.MyClass.Create, который удовлетворяет указанным ограничениям связывания.

Внутреннее исключение говорит

Массив не может быть пустым. Название параметра: match

Метод Create выглядит следующим образом

internal class MyClass : IMyInterface
{
  // ...

  public IMyInterface Create ()
  {
    return new MyClass();
  }
}

Что я могу сделать?

1 Ответ

0 голосов
/ 17 января 2019

Ваш фабричный метод должен быть статическим и находиться в общедоступном классе.

У меня работает следующее:

[assembly: XmlnsDefinition("http://schemas.Demo", "MyNameSpace")]

namespace MyNameSpace
{
    public interface IMyInterface
    {
        string MyProperty { get; set; }
    }

    internal class MyClass : IMyInterface
    {
        public string MyProperty { get; set; }
    }

    public static class MyClassFactory
    {
        public static IMyInterface Create()
        {
            return new MyClass();
        }
    }

    public class TestClass
    {
        public static void Test()
        {
            var myInterface = XamlServices.Parse(@"<IMyInterface xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns=""http://schemas.Demo"" 
    x:FactoryMethod=""MyClassFactory.Create"" 
    MyProperty=""MyValue""/>") as IMyInterface;
            Debug.Assert(myInterface != null);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...