Pooja Trivedi
Pooja Trivedi

Reputation: 71

Using reflection to assign value to class fields

I am calling multiple methods of a single web service. For every method, i need to create a unique request and have to pass site credentials and user credentials everytime which is a very repetitive task. Please find the code below.

ClientService.AddOrUpdateClientsRequest clientRequest = new ClientService.AddOrUpdateClientsRequest();
        // Create and fill credentials
        clientRequest.SourceCredentials = new ClientService.SourceCredentials();
        clientRequest.SourceCredentials.SourceName = sourcename;
        clientRequest.SourceCredentials.Password = password;
        clientRequest.SourceCredentials.SiteIDs = siteIDs;


        clientRequest.UserCredentials = new ClientService.UserCredentials();
        clientRequest.UserCredentials.Username = "Siteowner";
        clientRequest.UserCredentials.Password = "apitest1234";
        clientRequest.UserCredentials.SiteIDs = siteIDs;


 ClientService.AddOrUpdateClientsRequest updateClientRequest = new ClientService.AddOrUpdateClientsRequest();
            // Create and fill credentials
            updateClientRequest.SourceCredentials = new ClientService.SourceCredentials();
            updateClientRequest.SourceCredentials.SourceName = sourcename;
            updateClientRequest.SourceCredentials.Password = password;
            updateClientRequest.SourceCredentials.SiteIDs = siteIDs;


            updateClientRequest.UserCredentials = new ClientService.UserCredentials();
            updateClientRequest.UserCredentials.Username = "Siteowner";
            updateClientRequest.UserCredentials.Password = "apitest1234";
            updateClientRequest.UserCredentials.SiteIDs = siteIDs;

 ClientService.UploadClientDocumentRequest uploadRequest = new ClientService.UploadClientDocumentRequest();

// Assign credentials for UploadClientDocumentRequest object

How can i create a generic function to assign values to same credentials fields but different type of objects. I was looking at using reflection but didn't get anything online

Upvotes: 0

Views: 132

Answers (1)

CodeCaster
CodeCaster

Reputation: 151588

There's no need to use reflection. WCF proxy classes are generated as partials, so you can create a an interface to apply to all DTOs which contain these properties:

public interface IAuthorizedRequest
{
    SourceCredentials SourceCredentials { get; set; }
    UserCredentials UserCredentials { get; set; }
}

Then in a new or the same file, apply this interface to all those DTO classes:

// Merely apply the interface, the other partial contains the properties
public partial class AddOrUpdateClientsRequest : IAuthorizedRequest { }
public partial class SomeOtherRequest : IAuthorizedRequest { }

Then you can create a method which applies the credentials to any IAuthorizedRequest:

public void ApplyCredentials(IAuthorizedRequest request) 
{
    request.SourceCredentials = new ClientService.SourceCredentials();
    request.SourceCredentials.SourceName = sourcename;
    request.SourceCredentials.Password = password;
    request.SourceCredentials.SiteIDs = siteIDs;

    request.UserCredentials = new ClientService.UserCredentials();
    request.UserCredentials.Username = "Siteowner";
    request.UserCredentials.Password = "apitest1234";
    request.UserCredentials.SiteIDs = siteIDs;
}

And then call it like this:

var request = new AddOrUpdateClientsRequest();
ApplyCredentials(request);

Upvotes: 2

Related Questions