백엔드 개발 C#.Net 튜토리얼 C#의 리플렉션 및 기능을 사용하여 단순화된 예제 코드

C#의 리플렉션 및 기능을 사용하여 단순화된 예제 코드

Sep 06, 2017 pm 01:48 PM
.net 단순화하다

이제 학생 클래스(Student)가 있다고 가정합니다


    
 
     
      
         
           {  { name = 
         
          Age { ;  
         
          Address { ;
로그인 후 복사

일부 필드(속성)가 비어 있고 0보다 큰지 확인해야 하는 경우 다음 코드가 있습니다.


public static string ValidateStudent(Student student)
        {
            StringBuilder validateMessage = new StringBuilder();            
            if (string.IsNullOrEmpty(student.Name))
            {
                validateMessage.Append("名字不能为空");
            }            if (string.IsNullOrEmpty(student.Sex))
            {
                validateMessage.Append("性别不能为空");
            }            if (student.Age <= 0)
            {
                validateMessage.Append("年龄必填大于0");
            }            
            //...... 几百行            
            // 写到这里发现不对啊,如果必填项有20多个,难道我要一直这样写吗!
            return validateMessage.ToString();
        }
로그인 후 복사

이와 같은 코드는 재사용성이 높지 않고 효율성도 낮습니다.

속성과 리플렉션을 사용한 다음 속성을 반복하고 속성을 확인할 수 있습니다.

먼저 Attribute


    /// <summary>
    /// 【必填】特性,继承自Attribute    /// </summary>
    public sealed class RequireAttribute : Attribute
    {        private bool isRequire;        public bool IsRequire
        {            get { return isRequire; }
        }        /// <summary>
        /// 构造函数        /// </summary>
        /// <param name="isRequire"></param>
        public RequireAttribute(bool isRequire)
        {            this.isRequire = isRequire;
        }
    }
로그인 후 복사

에서 상속된 [필수] 속성 클래스를 사용자 정의한 다음 이 사용자 정의된 속성을 사용하여 학생 클래스의 구성원 속성을 표시합니다.


/// <summary>
    /// 学生类    /// </summary>
    public class Student
    {   
        /// <summary>
        /// 名字        /// </summary>
        private string name;
        [Require(true)]        public string Name
        {            get { return name; }            set { name = value; }
        }        /// <summary>
        /// 年龄        /// </summary>
        [Require(true)]        public int Age { get; set; }        /// <summary>
        /// 地址        /// </summary>
        [Require(false)]        public string Address { get; set; }        /// <summary>
        /// 性别        /// </summary>
        [Require(true)] 
        public string Sex;
    }
로그인 후 복사

속성을 통해 클래스의 속성을 확인합니다. :


  /// <summary>
        /// 检查方法,支持泛型        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="instance"></param>
        /// <returns></returns>
        public static string CheckRequire<T>(T instance)
        {            
        var validateMsg = new StringBuilder();            
        //获取T类的属性
            Type t = typeof (T);            
            var propertyInfos = t.GetProperties();            
            //遍历属性
            foreach (var propertyInfo in propertyInfos)
            {                
            //检查属性是否标记了特性
                RequireAttribute attribute = (RequireAttribute) Attribute.GetCustomAttribute(propertyInfo, typeof (RequireAttribute));                
                //没标记,直接跳过
                if (attribute == null)
                {                    
                continue;
                }                
                //获取属性的数据类型
                var type = propertyInfo.PropertyType.ToString().ToLower();                
                //获取该属性的值
                var value = propertyInfo.GetValue(instance);                
                if (type.Contains("system.string"))
                {                    
                if (string.IsNullOrEmpty((string) value) && attribute.IsRequire)
                        validateMsg.Append(propertyInfo.Name).Append("不能为空").Append(",");
                }                
                else if (type.Contains("system.int"))
                {                    
                if ((int) value == 0 && attribute.IsRequire)
                        validateMsg.Append(propertyInfo.Name).Append("必须大于0").Append(",");
                }
            }            return validateMsg.ToString();
        }
로그인 후 복사

검증 수행:


static void Main(string[] args)
        {            var obj = new Student()
            {
                Name = ""
            };
            Console.WriteLine(CheckRequire(obj));
            Console.Read();
        }
로그인 후 복사

결과 출력:

Sex도 [필수(true)]로 표시되어 있는데 검증 정보가 없는 이유는 다음과 같습니다. 섹스는 속성 { get }을 구현하지 않습니다. GetProperties를 얻을 수 없습니다.

위 내용은 C#의 리플렉션 및 기능을 사용하여 단순화된 예제 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C#의 취업 전망은 어떻습니까? C#의 취업 전망은 어떻습니까? Oct 19, 2023 am 11:02 AM

초보자이든 숙련된 전문가이든 C#을 마스터하면 경력을 쌓는 길이 열릴 것입니다.

여러 .NET 오픈 소스 AI 및 LLM 관련 프로젝트 프레임워크 공유 여러 .NET 오픈 소스 AI 및 LLM 관련 프로젝트 프레임워크 공유 May 06, 2024 pm 04:43 PM

오늘날 인공지능(AI) 기술 개발은 본격화되고 있으며, 다양한 분야에서 큰 잠재력과 영향력을 보여주고 있습니다. 오늘 Dayao는 여러분에게 몇 가지 참고 자료를 제공하고자 4개의 .NET 오픈 소스 AI 모델 LLM 관련 프로젝트 프레임워크를 공유할 것입니다. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel은 OpenAI, Azure와 같은 대규모 언어 모델(LLM)을 통합하도록 설계된 오픈 소스 소프트웨어 개발 키트(SDK)입니다.

numpy를 목록으로 변환: 데이터 처리 프로세스를 단순화하는 효과적인 전략 numpy를 목록으로 변환: 데이터 처리 프로세스를 단순화하는 효과적인 전략 Jan 19, 2024 am 10:47 AM

NumPy는 데이터 처리 및 기계 학습 애플리케이션에서 매우 유용하고 널리 사용되는 라이브러리입니다. NumPy의 중요한 특징은 Python의 배열과 행렬에 대한 수학적 연산을 위한 수많은 도구 기능을 제공한다는 것입니다. 이는 NumPy를 과학 컴퓨팅 분야에서 중요한 도구로 만듭니다. 그러나 많은 경우 코드에서 더 잘 사용하려면 NumPy 배열을 Python 목록(또는 기타 유사한 데이터 유형)으로 변환해야 합니다. NumPy 배열은 여러 면에서 P보다 우수하지만

개발자를 위한 .NET 성능 최적화 기술 개발자를 위한 .NET 성능 최적화 기술 Sep 12, 2023 am 10:43 AM

.NET 개발자라면 고품질 소프트웨어 제공에 있어 기능과 성능 최적화의 중요성을 인식해야 합니다. 제공된 리소스를 전문적으로 활용하고 웹 사이트 로드 시간을 줄임으로써 사용자에게 즐거운 경험을 선사할 뿐만 아니라 인프라 비용도 절감할 수 있습니다.

Java 프레임워크와 .NET 프레임워크 간의 성능 차이 Java 프레임워크와 .NET 프레임워크 간의 성능 차이 Jun 03, 2024 am 09:19 AM

높은 동시성 요청 처리 측면에서 .NETASP.NETCoreWebAPI는 JavaSpringMVC보다 성능이 뛰어납니다. 그 이유는 다음과 같습니다. 시작 시간을 줄여주는 AOT 조기 컴파일, 개발자가 개체 메모리 할당 및 해제를 담당하는 경우.

PHP 화살표 함수: 루프 처리를 단순화하는 방법 PHP 화살표 함수: 루프 처리를 단순화하는 방법 Sep 13, 2023 am 08:15 AM

PHP 화살표 함수: 루프 처리를 단순화하는 방법, 특정 코드 예제가 필요함 소개: PHP7.4가 출시되면서 화살표 함수는 PHP에서 매우 흥미로운 새 기능이 되었습니다. 화살표 함수의 출현으로 루프를 다룰 때 더욱 간결하고 편리해졌습니다. 이 문서에서는 화살표 함수의 기본 구문과 화살표 함수를 사용하여 루프 처리를 단순화하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 화살표 함수의 기본 구문 화살표 함수의 구문은 매우 간단하며 익명 함수를 작성하는 지름길이라고 볼 수 있습니다. 문법적 구조

PHP7의 Null Coalesce 연산자: 코드의 조건부 판단을 단순화하는 방법은 무엇입니까? PHP7의 Null Coalesce 연산자: 코드의 조건부 판단을 단순화하는 방법은 무엇입니까? Oct 20, 2023 am 09:18 AM

PHP7의 NullCoalesce 연산자: 코드의 조건부 판단을 단순화하는 방법은 무엇입니까? 개발 과정에서 변수에 값이 있는지 또는 null인지 여부를 결정하기 위해 조건부 판단을 수행해야 하는 경우가 많습니다. 전통적인 방법은 조건부 판단을 수행하기 위해 if 문이나 삼항 연산자를 사용하는 것이지만, 이러한 작성 방법은 어떤 경우에는 길고 복잡해 보입니다. 다행스럽게도 NullCoalesce 연산자(??)가 PHP7에 도입되어 코드 작성 방식을 단순화하고 개발 효율성을 향상시키는 데 도움이 됩니다. N

C# .NET 인터뷰 질문 및 답변 : 전문 지식 레벨 업 C# .NET 인터뷰 질문 및 답변 : 전문 지식 레벨 업 Apr 07, 2025 am 12:01 AM

C#.NET 인터뷰 질문 및 답변에는 기본 지식, 핵심 개념 및 고급 사용이 포함됩니다. 1) 기본 지식 : C#은 Microsoft가 개발 한 객체 지향 언어이며 주로 .NET 프레임 워크에 사용됩니다. 2) 핵심 개념 : 위임 및 이벤트는 동적 바인딩 방법을 허용하고 LINQ는 강력한 쿼리 기능을 제공합니다. 3) 고급 사용 : 비동기 프로그래밍은 응답 성을 향상시키고 표현 트리는 동적 코드 구성에 사용됩니다.

See all articles