2012-09-01 16 views
6

Chcę napisać fragment kodu, który ma następującą rzecz, jak gdyby Mam klasy powiedzmy MyClass:Jak napisać fragment kodu, aby wygenerować metodę w języku C#?

class MyClass 
    { 
     public int Age { get; set; } 
     public string Name { get; set; } 
    } 

więc fragment powinien utworzyć następujący sposób:

public bool DoUpdate(MyClass myClass) 
    { 
     bool isUpdated = false; 
     if (Age != myClass.Age) 
     { 
      isUpdated = true; 
      Age = myClass.Age; 
     } 
     if (Name != myClass.Name) 
     { 
      isUpdated = true; 
      Name = myClass.Name; 
     } 
     return isUpdated; 
    } 

Więc pomysł jest jeśli wywołaję fragment kodu dla dowolnej klasy, powinien on utworzyć metodę DoUpdate i powinien zapisać wszystkie właściwości w taki sam sposób, jak to zrobiłem w powyższym przykładzie.

Więc chcę wiedzieć:

  1. Czy można zrobić wyżej?
  2. Jeśli tak, jak mam zacząć, jakiekolwiek wskazówki?
+0

dlaczego nie używać tylko niektórych koncepcji OOP? – Tigran

+0

Jakie są wymagania? Czy szukasz tylko nieruchomości? Czy chcesz również właściwości statyczne? – itsme86

+0

Tylko właściwości ... –

Odpowiedz

1

Jak o użytkowego Sposób zamiast:

public static class MyUtilities 
{ 
    public static bool DoUpdate<T>(
     this T target, T source) where T: class 
    { 
     if(target == null) throw new ArgumentNullException("target"); 
     if(source == null) throw new ArgumentNullException("source"); 

     if(ReferenceEquals(target, source)) return false; 
     var props = typeof(T).GetProperties(
      BindingFlags.Public | BindingFlags.Instance); 
     bool result = false; 
     foreach (var prop in props) 
     { 
      if (!prop.CanRead || !prop.CanWrite) continue; 
      if (prop.GetIndexParameters().Length != 0) continue; 

      object oldValue = prop.GetValue(target, null), 
        newValue = prop.GetValue(source, null); 
      if (!object.Equals(oldValue, newValue)) 
      { 
       prop.SetValue(target, newValue, null); 
       result = true; 
      } 
     } 
     return result; 
    } 
} 

z przykładowym stosowania:

var a = new MyClass { Name = "abc", Age = 21 }; 
var b = new MyClass { Name = "abc", Age = 21 }; 
var c = new MyClass { Name = "def", Age = 21 }; 

Console.WriteLine(a.DoUpdate(b)); // false - the same 
Console.WriteLine(a.DoUpdate(c)); // true - different 

Console.WriteLine(a.Name); // "def" - updated 
Console.WriteLine(a.Age); 

Należy zauważyć, że można to zoptymalizować, jeśli ma być używana w ciasnej pętli (itp.), Ale wymaga to znajomości meta-programowania.

+0

Co jeśli mam inne typy w MyClass jako właściwości? –

+0

To naprawdę dobre rozwiązanie, ale czy można również napisać fragment, żeby zrobić to samo? –

+0

@Praveen zdefiniuj "inne typy"; re snippet - Nie mam pojęcia –

1

Twoje fragmenty powinny być pod

C: \ Users \ Coolmine \ Documents \ Visual Studio (wersja) \ code Fragmenty \ Visual C# \ My fragmenty kodu

Najbardziej W prosty sposób możesz wziąć istniejący fragment i zmodyfikować go, aby uniknąć rekonstrukcji układu pliku.

Oto szablon można pracować z:

<?xml version="1.0" encoding="utf-8" ?> 
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
     <Header> 
      <Title>snippetTitle</Title> 
      <Shortcut>snippetShortcutWhichYouWillUseInVS</Shortcut> 
      <Description>descriptionOfTheSnippet</Description> 
      <Author>yourname</Author> 
      <SnippetTypes> 
       <SnippetType>Expansion</SnippetType> 
      </SnippetTypes> 
     </Header> 
     <Snippet> 
      <Declarations> 
       <Literal> 
       </Literal> 
       <Literal Editable="false"> 
       </Literal> 
      </Declarations> 
      <Code Language="csharp"><![CDATA[yourcodegoeshere]]> 
      </Code> 
     </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 

To powinno się przydać, gdy chcesz go do generowania nazw na podstawie nazwy klasy i tak dalej: http://msdn.microsoft.com/en-us/library/ms242312.aspx

+0

Zasugerowałem coś podobnego tutaj http://stackoverflow.com/a/19247785/687441, ale tylko do stworzenia pustej metody. Zazwyczaj użyłbym fragmentu właściwości (prop lub propfull gdzie jest klawiszem tabulatora na klawiaturze) w celu utworzenia właściwości, ale jeśli jest to zawsze ten sam kod, można zakodować właściwości zgodnie z sugestią trybu coolmine; nie nadaje się jednak do ponownego wykorzystania. –

Powiązane problemy