2017-02-06 2 views
-2

Я пытаюсь сделать простое расширение строки, которое назначает изменения исходной строке (например, toUpper). В этом случае метод присваивает содержимое второму аргументу, если он не является ни белым space или null ... в противном случае оно оставляет текущее значение на месте или присваивает пустое значение «". Таким образом, я хотел бы иметь его пойти:Проблема с расширением строки в C#

somerecord.Property1.func(someobj.property); 
somerecord.Property2.func(someobj.otherproperty); 
somerecord.Property3.func(someobj.anotherproperty); 

в то время как мой код выглядит

public static string func(this String str, string replacement) 
    { 
     if (!String.IsNullOrWhiteSpace(replacement)) { 
      str = replacement; 
      return replacement; 
     } 
     else 
     { 
      if(str == null) 
       str = ""; 
      return ""; 
     } 
    } 

Я хотел установить this к ref, но я не могу. Любые идеи о том, как реализовать это чисто?

+1

Я вполне уверен, что нет никакого способа сделать это. Вы не можете «отменить это» (т. Е. Вы не можете изменить переменную), и вы не можете изменить экземпляр строки. –

+1

@ThomasD. Методы расширения будут отлично работать с 'null', не уверен, что вы пытаетесь сказать. – InBetween

+0

Thomas D., Если я создаю объект obj, у которого есть неопределенная строка свойства s, то obj.s.func (something) будет показывать строку как null. Майкл Гюнтер, как работают методы, такие как ToLower и ToUpper? – user3856804

ответ

1

Не заставляйте метод метод расширения, осуществлять регулярный статический метод:

public static void func(ref string str, string replacement) 
{ 
    if (!String.IsNullOrWhiteSpace(replacement)) { 
     str = replacement; 
    } 
    else 
    { 
     if(str == null) 
      str = ""; 
    } 
} 

замечают, однако, что ваш случай использования будет по-прежнему не работает, вы не можете передать собственность в качестве аргумента ref начинаются с:

class Foo 
{ 
    public string someVariable; 
    public string SomeProperty { get; } 
} 

var foo = new Foo(); 
func(ref foo.someVariable, ""); //ok 
func(ref foo.SomeProperty, ""); //compile time error