2012-09-01 45 views
6

Tôi muốn viết một đoạn mã mà sau điều, như thế nào nếu tôi có một lớp giả MyClass:Làm thế nào để viết một đoạn mã để tạo ra một phương thức trong C#?

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

nên đoạn nên tạo phương pháp sau đây:

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; 
    } 

Vì vậy, ý tưởng là nếu tôi gọi đoạn mã cho bất kỳ lớp nào, nó sẽ tạo phương thức DoUpdate và nên viết tất cả các thuộc tính theo cách mà tôi đã làm trong ví dụ trên.

Vì vậy, tôi muốn biết:

  1. Có thể làm các việc trên?
  2. Nếu có, tôi nên bắt đầu như thế nào, mọi hướng dẫn?
+0

tại sao không sử dụng một số khái niệm OOP? – Tigran

+0

Yêu cầu là gì? Bạn chỉ đang tìm kiếm tài sản? Bạn có muốn các thuộc tính tĩnh không? – itsme86

+0

Chỉ các thuộc tính ... –

Trả lời

1

Làm thế nào về một tiện ích phương pháp thay vì:

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; 
    } 
} 

với ví dụ sử dụng:

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); 

Lưu ý rằng điều này có thể được tối ưu hóa cực kỳ nếu nó sẽ được sử dụng trong một vòng lặp chặt chẽ (vv), nhưng làm như vậy đòi hỏi kiến ​​thức lập trình meta.

+0

Nếu tôi có các loại khác trong MyClass là tài sản thì sao? –

+0

Nó thực sự là giải pháp rất tốt nhưng nó cũng có thể viết một đoạn để làm như vậy? –

+0

@Praveen xác định "các loại khác"; Tôi không có ý tưởng –

1

đoạn của bạn nên được dưới

C: \ Users \ CooLMinE \ Documents \ Visual Studio (phiên bản) \ Mã Snippets \ Visual C# \ Code Snippets My

Nhất cách dễ dàng bạn đang dùng một đoạn mã tồn tại và sửa đổi nó để tránh tái tạo bố cục của tệp.

Dưới đây là một mẫu bạn có thể làm việc với:

<?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> 

này nên có ích khi bạn muốn nó để tạo ra tên dựa trên tên lớp và vân vân: http://msdn.microsoft.com/en-us/library/ms242312.aspx

+0

Tôi đề nghị một cái gì đó tương tự ở đây http://stackoverflow.com/a/19247785/687441 nhưng chỉ để tạo ra một phương pháp trống. Thông thường, tôi sẽ sử dụng đoạn mã thuộc tính (prop hoặc prop 01ull trong đó là phím tab trên bàn phím của bạn) để tạo thuộc tính, nhưng nếu mã luôn giống nhau, bạn có thể mã hóa các thuộc tính như được đề xuất; không tốt cho tái sử dụng mặc dù. –

Các vấn đề liên quan