[C#] C #에서 가장 좋아하는 확장 방법은 무엇입니까? (codeplex.com/extensionoverflow)

우수하고 선호하는 확장 방법 을 게시하는 답변 목록을 만들어 봅시다 .

요구 사항은 전체 코드를 게시하고 사용 방법에 대한 예와 설명을 게시해야합니다.

이 주제에 대한 높은 관심을 바탕으로 Codeplex에 extensionoverflow라는 오픈 소스 프로젝트를 설정했습니다 .

Codeplex 프로젝트에 코드를 넣을 수 있도록 답을 표시하십시오.

링크가 아닌 전체 소스 코드를 게시하십시오.

Codeplex 뉴스 :

24.08.2010 Codeplex 페이지는 다음과 같습니다 : http://extensionoverflow.codeplex.com/

2008년 11월 11일 XMLSERIALIZE / XmlDeserialize는 지금 구현단위 테스트 .

11.11.2008 더 많은 개발자를위한 여지가 여전히 남아 있습니다. 😉 지금 가입하십시오!

2008 년 11 월 11 일 세 번째 제공자가 ExtensionOverflow 에 합류 하여 BKristensen에 오신 것을 환영합니다

2008년 11월 11일 FormatWith는 지금 구현단위 테스트 .

2008 년 9 월 11 일 두 번째 제공자가 ExtensionOverflow 에 합류했습니다 . chakrit에 오신 것을 환영합니다 .

2008 년 9 월 11 일 더 많은 개발자가 필요합니다. 😉

2008 년 9 11 일 ThrowIfArgumentIsNull 은 이제 Codeplex 에서 구현테스트 되었습니다.



답변

public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

교체 할 수 있습니다 :

if(reallyLongIntegerVariableName == 1 || 
    reallyLongIntegerVariableName == 6 || 
    reallyLongIntegerVariableName == 9 || 
    reallyLongIntegerVariableName == 11)
{
  // do something....
}

and

if(reallyLongStringVariableName == "string1" || 
    reallyLongStringVariableName == "string2" || 
    reallyLongStringVariableName == "string3")
{
  // do something....
}

and

if(reallyLongMethodParameterName == SomeEnum.Value1 || 
    reallyLongMethodParameterName == SomeEnum.Value2 || 
    reallyLongMethodParameterName == SomeEnum.Value3 || 
    reallyLongMethodParameterName == SomeEnum.Value4)
{
  // do something....
}

와:

if(reallyLongIntegerVariableName.In(1,6,9,11))
{
      // do something....
}

and

if(reallyLongStringVariableName.In("string1","string2","string3"))
{
      // do something....
}

and

if(reallyLongMethodParameterName.In(SomeEnum.Value1, SomeEnum.Value2, SomeEnum.Value3, SomeEnum.Value4)
{
  // do something....
}


답변

MiscUtil 프로젝트 에 다양한 확장 방법 이 있습니다 (전체 소스를 사용할 수 있습니다-여기서는 반복하지 않겠습니다). 내가 좋아하는 것 중 일부는 다른 수업 (예 : 범위)과 관련이 있습니다.

날짜 및 시간 항목-대부분 단위 테스트에 사용됩니다. 프로덕션에서 사용할 것인지 확실하지 않습니다. 🙂

var birthday = 19.June(1976);
var workingDay = 7.Hours() + 30.Minutes();

범위와 스테핑-Marc Gravell에게 이를 가능하게하는 운영자의 작업 에 감사드립니다 .

var evenNaturals = 2.To(int.MaxValue).Step(2);
var daysSinceBirth = birthday.To(DateTime.Today).Step(1.Days());

비교 :

var myComparer = ProjectionComparer.Create(Person p => p.Name);
var next = myComparer.ThenBy(p => p.Age);
var reversed = myComparer.Reverse();

인수 확인 :

x.ThrowIfNull("x");

익명 형식 (또는 적절한 속성을 가진 다른 형식)에 적용되는 LINQ to XML :

// <Name>Jon</Name><Age>32</Age>
new { Name="Jon", Age=32}.ToXElements();
// Name="Jon" Age="32" (as XAttributes, obviously)
new { Name="Jon", Age=32}.ToXAttributes()

LINQ 푸시-설명하는 데 시간이 오래 걸리지 만 검색하십시오.


답변

문자열. 형식 바로 가기 :

public static class StringExtensions
{
    // Enable quick and more natural string.Format calls
    public static string F(this string s, params object[] args)
    {
        return string.Format(s, args);
    }
}

예:

var s = "The co-ordinate is ({0}, {1})".F(point.X, point.Y);

빠른 복사하여 붙여 넣기를 하려면 여기 로 이동 하십시오 .

"some string".F("param")대신 입력 하는 것이 더 자연스럽지 string.Format("some string", "param")않습니까?

읽기 쉬운 이름을 보려면 다음 제안 중 하나를 시도하십시오.

s = "Hello {0} world {1}!".Fmt("Stack", "Overflow");
s = "Hello {0} world {1}!".FormatBy("Stack", "Overflow");
s = "Hello {0} world {1}!".FormatWith("Stack", "Overflow");
s = "Hello {0} world {1}!".Display("Stack", "Overflow");
s = "Hello {0} world {1}!".With("Stack", "Overflow");

..


답변

이것들은 어떤 용도입니까?

public static bool CoinToss(this Random rng)
{
    return rng.Next(2) == 0;
}

public static T OneOf<T>(this Random rng, params T[] things)
{
    return things[rng.Next(things.Length)];
}

Random rand;
bool luckyDay = rand.CoinToss();
string babyName = rand.OneOf("John", "George", "Radio XBR74 ROCKS!");


답변

public static class ComparableExtensions
{
  public static bool Between<T>(this T actual, T lower, T upper) where T : IComparable<T>
  {
    return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) < 0;
  }
}

예:

if (myNumber.Between(3,7))
{
  // ....
}


답변

확장 방법 :

public static void AddRange<T, S>(this ICollection<T> list, params S[] values)
    where S : T
{
    foreach (S value in values)
        list.Add(value);
}

이 방법은 모든 유형에 적용되며 목록에 다양한 항목을 매개 변수로 추가 할 수 있습니다.

예:

var list = new List<Int32>();
list.AddRange(5, 4, 8, 4, 2);


답변

반드시 이것을 코드 플렉스 프로젝트에 넣으십시오.

객체를 XML로 직렬화 / 역 직렬화 :

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="obj">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T obj) where T : class, new()
{
    if (obj == null) throw new ArgumentNullException("obj");

    var serializer = new XmlSerializer(typeof(T));
    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    var serializer = new XmlSerializer(typeof(T));
    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}