2010-04-06 4 views
4

개체를 가져 와서 해당 값을 null에서 string.empty로 변환하는 가장 쉬운 방법은 무엇입니까?개체의 빈 문자열로 Null을 변환

나는 모든 객체를 전달할 수있는 루틴을 생각하고 있었지만 모든 값을 반복하는 방법을 모르겠습니다.

+0

'object'의 모든 'string'속성을 null에서'String.Empty'로 바꾸는 것을 의미합니까? –

+0

"해당"값이 있습니까? 검사 할 개체의 유형은 무엇입니까? – Thomas

답변

12

개체가 속성을 통해 그것의 값을 노출하면이 같은 것을 쓸 수 있습니다 : 또 다른 해결책은 반사를 사용하는 것입니다

string Value { get { return m_Value ?? string.Empty; } } 

합니다. 반사를 사용하는 것과 비슷 그럴 수 뭔가

var myObject = new MyObject(); 
foreach(var propertyInfo in myObject.GetType().GetProperties()) 
{ 
    if(propertyInfo.PropertyType == typeof(string)) 
    { 
     if(propertyInfo.GetValue(myObject, null) == null) 
     { 
      propertyInfo.SetValue(myObject, string.Empty, null); 
     } 
    } 
} 
+1

아마도 더 많은 체크가 필요합니다 : 클래스가 null 읽기 전용 속성을 가질 때 예외를 막기 위해 SetValue 직전에'if (propertyInfo.CanWrite)'가 유용 할 것입니다. –

8

:

public static class Extensions 
{ 
    public static void Awesome<T>(this T myObject) where T : class 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(); 
     foreach(var info in properties) 
     { 
      // if a string and null, set to String.Empty 
      if(info.PropertyType == typeof(string) && 
       info.GetValue(myObject, null) == null) 
      { 
       info.SetValue(myObject, String.Empty, null); 
      } 
     } 
    } 
} 
+0

+1 글로벌 아름다운 대답! 제네릭 없이는 작동하지 않겠습니까? 대신에 객체를 사용하고 myObject.GetType()을 사용하십시오. typeof (T) 대신 GetProperties()를 사용하십시오 .GetProperties() – BritishDeveloper

+0

당신의 코멘트가 제안하는 것처럼 덮어 쓰기 전에'value == null'인지 확인해야합니다 ^^ – tanascius

+0

참으로 내가해야한다; 0 –

0
당신은 반사를 사용할 수

를이 코드는 문자열 형식의 속성을 확인합니다. 어딘가 대신 ""멋진 쾌적한의, 사방에 "널 (null)"을 보여주는

class Foo 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public string Prop3 { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new Foo 
     { 
      Prop1 = (string)null, 
      Prop2 = (string)null, 
      Prop3 = (string)null, 
     }; 

     var props = typeof(Foo).GetProperties() 
      .Where(x => x.PropertyType == typeof(string)); 
     foreach (var p in props) 
     { 
      p.SetValue(foo, string.Empty, null); 
     } 
    } 
} 
2

는 아마도, 보고서 또는 양식을 가지고 여기에 중첩 한 수준의 예입니다.

nulls는 그대로 두는 것이 가장 좋으며 적절한 경우 표시 코드를 수정하십시오. 따라서,이 같은 라인 :

if (someObject == null) 
{ 
    label1.Text = ""; // or String.Empty, if you're one of *those* people 
} 
else 
{ 
    label1.Text = someObject.ToString(); 
} 

을 당신이 필요로 기능화 할 수 있습니다 :

label1.Text = someObject.ToString(); 

이가되어야

public void DisplayObject(Label label, Object someObject) 
{ 
    if (someObject == null) 
    { 
     label.Text = ""; // or String.Empty, if you're one of *those* people 
    } 
    else 
    { 
     label.Text = someObject.ToString(); 
    } 
} 
0

당신은 할 수있는 너무 많은 문제없이 반사를 통해, 나는 이것을 게시 할 때 정확하게 어떻게하는지 알려주는 답변이있을 것이라고 확신합니다.

하지만 개인적으로 반사 옵션을 좋아하지 않습니다.

저는 다양한 수단을 통해 모든 객체의 구성원에 대해 객체 불변성을 유지하는 것을 선호합니다. 문자열 멤버의 경우 불변 값은 종종 null이 아니며 때로 최대 길이 요구 사항도 있습니다 (예 : 데이터베이스에 저장). 다른 멤버에는 다른 종류의 불변성이 있습니다.

첫 번째 단계는 개체에 대해 정의한 모든 불변 조건을 확인하는 메서드를 만드는 것입니다.

[Conditional("DEBUG")] 
private void CheckObjectInvariant() 
{ 
    Debug.Assert(name != null); 
    Debug.Assert(name.Length <= nameMaxLength); 
    ... 
} 

그런 다음 개체를 조작하는 방법을 수행 한 후에이를 호출합니다. ConditionalAttribute으로 꾸며 졌으므로 이러한 호출은 응용 프로그램의 릴리스 버전에 나타나지 않습니다.

그러면 코드 중 어느 것도 이러한 불변성을 위반하지 않도록해야합니다. 즉, 문자열 필드는 선언에 초기화 기가 있어야하거나 객체의 모든 생성자에서 설정해야합니다.

아마도이 질문에 동기를 부여하는 특별한 문제는 자동 속성에 대해해야 할 일입니다.

public string Name { get; set; } 

분명히이 값은 언제든지 null로 설정할 수 있으며 이에 관해 할 수있는 것은 없습니다.

자동 속성과 관련하여 두 가지 옵션이 있습니다. 첫째, 전혀 사용할 수 없습니다. 이렇게하면 문제가 완전히 방지됩니다. 둘째, 가능한 문자열 값만 허용 할 수 있습니다. 즉, 해당 속성을 사용하는 모든 코드는 nulls, 10MB의 문자열 또는 그 사이의 값을 필요로합니다.

반사 옵션을 사용하여 null을 제거한 경우에도 NullReferenceException을 피하기 위해 객체에서 magic-null-removal 메소드를 호출해야하는 시점을 알 필요가 있으므로 실제로 그런 방식으로 구입하지 않았습니다.

0

+1 타나 시우스의 대답. 나는이 대답을 사용했지만 조금 비틀었다.

먼저 문자열 인 속성 만 가져 오므로 모든 속성을 반복하지 않습니다. 두 번째로, 모든 내 엔티티가 상속하는 BaseEntity 클래스를 배치하여 전역으로 설정하므로 모든 엔티티에 배치 할 필요가 없습니다.

public class BaseEntity 
{ 
    public int Id { get; set; } 

    public BaseEntity() 
    { 
     var stringProperties = this.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)); 

     foreach (var property in stringProperties) 
     { 
      if (property.GetValue(this, null) == null) 
      { 
       property.SetValue(this, string.Empty, null); 
      } 
     } 
    } 
}