C# check for ref field custom attribute












1















I'd like to check for a field custom attribute of a field, that ref field is pointing to.



I have the following code example:



public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);

if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}


And the following code usage:



[SpecialChange]
private int m_field1 = default(int);

public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }

[SpecialChange]
private string m_field2 = default(string);

public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }


I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:




  • Iterate over class fields and use ReferenceEquals - not working with value types.

  • Get field offset from Marshal and compare with field pointer - cant get the address of managed type T


Any ideas or tips?










share|improve this question























  • You could check if it implements the IEquatable<> or the IComparable interface

    – J. van Langen
    Nov 14 '18 at 11:10













  • Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea

    – Kamil Kowalewski
    Nov 14 '18 at 11:22
















1















I'd like to check for a field custom attribute of a field, that ref field is pointing to.



I have the following code example:



public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);

if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}


And the following code usage:



[SpecialChange]
private int m_field1 = default(int);

public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }

[SpecialChange]
private string m_field2 = default(string);

public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }


I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:




  • Iterate over class fields and use ReferenceEquals - not working with value types.

  • Get field offset from Marshal and compare with field pointer - cant get the address of managed type T


Any ideas or tips?










share|improve this question























  • You could check if it implements the IEquatable<> or the IComparable interface

    – J. van Langen
    Nov 14 '18 at 11:10













  • Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea

    – Kamil Kowalewski
    Nov 14 '18 at 11:22














1












1








1








I'd like to check for a field custom attribute of a field, that ref field is pointing to.



I have the following code example:



public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);

if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}


And the following code usage:



[SpecialChange]
private int m_field1 = default(int);

public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }

[SpecialChange]
private string m_field2 = default(string);

public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }


I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:




  • Iterate over class fields and use ReferenceEquals - not working with value types.

  • Get field offset from Marshal and compare with field pointer - cant get the address of managed type T


Any ideas or tips?










share|improve this question














I'd like to check for a field custom attribute of a field, that ref field is pointing to.



I have the following code example:



public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);

if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}


And the following code usage:



[SpecialChange]
private int m_field1 = default(int);

public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }

[SpecialChange]
private string m_field2 = default(string);

public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }


I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:




  • Iterate over class fields and use ReferenceEquals - not working with value types.

  • Get field offset from Marshal and compare with field pointer - cant get the address of managed type T


Any ideas or tips?







c# c#-6.0






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 14 '18 at 11:06









Kamil KowalewskiKamil Kowalewski

82




82













  • You could check if it implements the IEquatable<> or the IComparable interface

    – J. van Langen
    Nov 14 '18 at 11:10













  • Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea

    – Kamil Kowalewski
    Nov 14 '18 at 11:22



















  • You could check if it implements the IEquatable<> or the IComparable interface

    – J. van Langen
    Nov 14 '18 at 11:10













  • Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea

    – Kamil Kowalewski
    Nov 14 '18 at 11:22

















You could check if it implements the IEquatable<> or the IComparable interface

– J. van Langen
Nov 14 '18 at 11:10







You could check if it implements the IEquatable<> or the IComparable interface

– J. van Langen
Nov 14 '18 at 11:10















Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea

– Kamil Kowalewski
Nov 14 '18 at 11:22





Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea

– Kamil Kowalewski
Nov 14 '18 at 11:22












1 Answer
1






active

oldest

votes


















0














I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.



What you can do is add additional parameter to your FieldSetter method that is an expression:



FieldSetter<T>(..., Expression<Func<T>> expression);


and call it like this:



FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);


This gives you lambda inside your method that you can inspect:



((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null





share|improve this answer
























  • Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

    – Kamil Kowalewski
    Nov 14 '18 at 11:32











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298758%2fc-sharp-check-for-ref-field-custom-attribute%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.



What you can do is add additional parameter to your FieldSetter method that is an expression:



FieldSetter<T>(..., Expression<Func<T>> expression);


and call it like this:



FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);


This gives you lambda inside your method that you can inspect:



((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null





share|improve this answer
























  • Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

    – Kamil Kowalewski
    Nov 14 '18 at 11:32
















0














I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.



What you can do is add additional parameter to your FieldSetter method that is an expression:



FieldSetter<T>(..., Expression<Func<T>> expression);


and call it like this:



FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);


This gives you lambda inside your method that you can inspect:



((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null





share|improve this answer
























  • Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

    – Kamil Kowalewski
    Nov 14 '18 at 11:32














0












0








0







I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.



What you can do is add additional parameter to your FieldSetter method that is an expression:



FieldSetter<T>(..., Expression<Func<T>> expression);


and call it like this:



FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);


This gives you lambda inside your method that you can inspect:



((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null





share|improve this answer













I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.



What you can do is add additional parameter to your FieldSetter method that is an expression:



FieldSetter<T>(..., Expression<Func<T>> expression);


and call it like this:



FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);


This gives you lambda inside your method that you can inspect:



((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null






share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 14 '18 at 11:20









RafalRafal

9,7022345




9,7022345













  • Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

    – Kamil Kowalewski
    Nov 14 '18 at 11:32



















  • Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

    – Kamil Kowalewski
    Nov 14 '18 at 11:32

















Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

– Kamil Kowalewski
Nov 14 '18 at 11:32





Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!

– Kamil Kowalewski
Nov 14 '18 at 11:32




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298758%2fc-sharp-check-for-ref-field-custom-attribute%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

The Sandy Post

Danny Elfman

Pages that link to "Head v. Amoskeag Manufacturing Co."