Предоставление свойств DynamicObject - PullRequest
0 голосов
/ 11 ноября 2018

Мне нужен способ предоставить членам Dynamic get и установить для данного класса. Я хочу иметь возможность написать код, подобный этому:

ns1.Resource.Field1 = "Hello";
string myField = ns1.Resource.Field1;

где ns1 - это пространство имен, и я считаю, что «Resource» - это имя класса, а Field1 или любое другое свойство является динамическим. Так как мне объявить такой класс?

Я узнал о наследовании класса Resource от «DynamicObject», но это вынуждает меня создавать экземпляр класса Resource для объекта - операция, которую я не хочу делать.

Изменить # 1:
Я хочу создать способ использовать класс следующим образом:

Namespace.Resource.DynamicField = "Value";
string myValue = Namespace.Resource.DynamicField;

«Ресурс» не должен создаваться, и DynamicField является членом, который мой класс сможет обрабатывать вызовы get и set для него, поэтому если в каком-то месте кода я напишу

Namespace.Resource.DynamicField2 = "Hello";

У меня будет место, где я могу переопределить вызов set для статического свойства "DynamicField2" Resource. Но я заранее не знаю полного списка свойств класса, поэтому мне нужно, чтобы свойства создавались динамически и были в состоянии контролировать получение и установку, как это было передано «Name», скажем:

public class Resource{

   public static getMember(string Name){
       console.log(Name); //=> this will output "DynamicField2"
       return this.dictionary["Name"];
   }
}  

, а затем использовать его где-нибудь под кодом

string a = Resource.DynamicField2; // a will be value "Hello" 

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Посмотрите на ExpandoObject:

https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=netframework-4.7.2

Это должно служить вашим потребностям.

EDIT.

Вы можете создать статическое свойство в классе Resource для доступа к одноэлементному экземпляру ExpandoObject.

Например

public static class Resource
{
     public static dynamic Data {get;} = new ExpandoObject();
}

Затем просто установите Resource.Data.Field1 = что угодно; и т.д.

0 голосов
/ 11 ноября 2018

Я не совсем понимаю, что вы имеете в виду. Но если вы хотите иметь такое значение (без создания объекта). Вы можете объявить ваш класс и переменную как статические:

namespace ns1{

public static class Resource {

    public static string Field1 = "hello-f1";
    public static string Field2 = "hello-f2";
}}

после этого вы можете использовать эту переменную, вызвав Обратите внимание, что переменная Fields не является константой, поэтому вы можете изменить ее везде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...