c# получить ссылку на новый класс и вставить его в свой собственный метод inline - PullRequest
0 голосов
/ 29 февраля 2020
public class Kitten
{     
    public  string Ears = "NotSet";
    public  string Fur = "NotSet";      
}

public class Cage
{ 

    Kitten _kitten;

    public Cage(Kitten Akitten)
    {

    }

    public Kitten Kitten
    {
        get
        {
            return _kitten;
        }

        set
        {
            _kitten = value;
        }
    }

    public string EchoKittenProperty(string PropName)
    {  
        return PropName;
    }

}

Есть ли способ получить доступ к новому классу и плюнуть его в метод inline?

Это просто:

var cg = new Cage( new Kitten(){  Ears = "Pointy", Fur = "Fluffy" });
var value = cg.EchoKittenProperty(cg.Kitten.Fur);
//value = "Fluffy"

Но как мне это сделать? :

var value = new Cage( new Kitten(){  Ears = "Pointy", Fur = "Fluffy" }).EchoKittenProperty(this.Kitten.Fur);
//value = "Fluffy"

Это тестовый класс:

public static class Test
{        
   public static void Test1()
   {             
        var cg = new Cage( new Kitten(){  Ears = "Pointy", Fur = "Fluffy" });
        var value = cg.EchoKittenProperty(cg.Kitten.Fur); 
        //value = "Fluffy"
   } 

   public static void Test2()
   {  
     //"this" is illegal here, but I want to get "this" to refer to the new Cage class           
     var value = new Cage( new Kitten(){  Ears = "Pointy", Fur = "Fluffy"}).EchoKittenProperty(this.Kitten.Fur);
     //value = "Fluffy"
   } 
}

Есть ли способ ссылаться на новый объект в методе EchoKittenProperty, не помещая его в переменную и не ссылаясь на него после?

Я думаю, что-то вроде этого позволяет вам связать методы в цепочку и получить доступ к экземпляру :

public class Cage
{ 
    public Cage EchoKittenProperty(Func<Cage, Cage> projection)
    {
        return projection(this);
    }

    Kitten _kitten;

    public Cage(Kitten Akitten)
    {

    }

    public Kitten Kitten
    {
        get
        {
            return _kitten;
        }

        set
        {
            _kitten = value;
        }
    }



    public Tuple<string,string> GetKittenInfo()
    { 

        return new Tuple<string, string>(this.Kitten.Fur, this.Kitten.Ears);

    }
}

Теперь вы можете цепляться без удержания котенка как переменная вне класса.

var KittenInfo = new Cage(new Kitten(){ })
        .EchoKittenProperty(i => 
        {                
            i.Kitten.Ears = "Pointy";                
            return i;
        }
        )
        .EchoKittenProperty( i =>
        {
            i.Kitten.Fur = "Fluffy";
           return i;
        }
        )
        .GetKittenInfo();

Вот что вы можете сделать с dbextensions и dapper:

List<Customer> Customers = SQLHelper.Select<Customer>(new Customer())
.Chain(x=> x.AddWhere(new MysqlWhere(nameof(x.Item.CustomerID), 25, MysqlWhere.OperatorEnum.Equals)))
.SelectAllWhere(); 

Мы хотели получить доступ к generi c с помощью цепочка, чтобы мы могли получить строго типизированные свойства.

Некоторое время использовал EF с Mysql, но в целом он не работает. Хотя выбор в EF намного проще при использовании методов Fluent.

1 Ответ

2 голосов
/ 29 февраля 2020

Я немного упростила Cage, но вот что вам нужно сделать:

public class Cage
{
    public Cage(Kitten kitten)
    {
        this.Kitten = kitten;
    }

    public Kitten Kitten { get; set; }

    public string EchoKittenProperty(Func<Kitten, string> projection)
    {
        return projection(this.Kitten);
    }
}

Теперь вы можете написать это:

string value = new Cage(new Kitten { Ears = "Pointy", Fur = "Fluffy" })
    .EchoKittenProperty(x => x.Fur);

А теперь value равно "Fluffy"

Однако это означает, что вы только что потеряли ссылку на саму Cage, и это делает это немного бессмысленным. Мне было бы интересно узнать, что вы пытаетесь сделать с помощью этого метода, чтобы я мог предложить более надежный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...