Enum 항목의 표시 이름을 저장하는 사용자 지정 특성이 있습니다. Enum 사용자 지정 특성 표시 이름을 반환하는 Extension 메서드를 작성합니다.
LINQ 쿼리에서 Extension 메서드를 사용합니다. 그러나 출력이 이상합니다. 아직 실행되지 않은 쿼리에서 확장 메서드를 호출하면 반환 Enum is null
되지만 .ToList()
호출 된 쿼리에서 실행하면 제대로 작동합니다 (출력 참조). 둘 사이의 차이점은 무엇입니까? 쿼리가 실행되지 않을 때 enum이 null 인 이유 ..
참고 : 저는 LINQPAD 입니다.
void Main()
{
Console.WriteLine(((ProductStatuses)0).GetTitle());
Console.WriteLine(((ProductStatuses)1).GetTitle());
Console.WriteLine(((ProductStatuses)3).GetTitle());
var query_01 = (from item in SH_Products
select new
{
Status = item.Status,
StatusText = ((ProductStatuses)item.Status).GetTitle(),
});
var query_02 = (from item in SH_Products.ToList()
select new
{
Status = item.Status,
StatusText = ((ProductStatuses)item.Status).GetTitle(),
});
query_01.Dump();
query_02.Dump();
}
public static class ExtensionMethods
{
public static string GetTitle(this Enum enm)
{
if (enm == null)
{
return "Enum is null";
}
var type = enm.GetType();
var members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
foreach (var item in members)
{
if (enm.ToString() == item.Name)
{
var attributes = item.GetCustomAttributes(typeof(FaraDisplay), false);
var attribute = String.Empty;
if (attributes.Length == 0)
attribute = item.Name;
else
attribute = ((FaraDisplay)attributes.Single()).GetName();
return attribute;
}
}
throw new InvalidEnumArgumentException();
}
}
public enum ProductStatuses
{
[FaraDisplay("Inactive Product")]
Inactive = 0,
[FaraDisplay("Available Product")]
Available = 1,
[FaraDisplay("ComingSoon Product")]
ComingSoon = 2,
[FaraDisplay("UnAvailable Product")]
UnAvailable = 3,
[FaraDisplay("OrderRegister Product")]
OrderRegister = 4
}
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class FaraDisplay : Attribute
{
private readonly string _name;
public FaraDisplay(string name)
{
_name = name;
}
public string GetName()
{
return _name;
}
}
산출:
비활성 제품
사용 가능한 제품
할수 없음 제품
열거가 null의 경우
열거는 null
열거는 null
열거는 null
비활성 제품
사용 가능한 제품
할수 없음 제품
할수 없음 제품
실제로 문제는 linq to sql이 GetTiltle()
sql 문 으로 변환하는 방법을 모르기 때문에 건너 뛰는 것입니다. 을 호출 할 때 ToList()
linq를 객체에 사용하고 있으므로 해당 시점에서 단순한 ol '.net이기 때문에 예상대로 작동합니다.
모든 linq 공급자 (엔티티 프레임 워크, nhibernate 등)에는 이와 동일한 문제가 있지만 엔티티 프레임 워크에서 예외가 발생하고 아마도 nhibernate도 발생할 수 있습니다.
수행중인 작업을 기반으로하는 방법이 없으므로 메모리에 개체가 있으면 해당 계산을 수행해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다